RainbowCrack

rainbowcrack

Собрал на днях полигон для прогона RainbowCrack «тестов».

Пока доступны алгоритмы: SHA1, MD5

Таблицы:

md5_mixalpha-numeric#1-8
(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789)
Вероятность подбора: 99.9%
127GB

md5_mixalpha-numeric#1-9
(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789)
Вероятность подбора: 96.8%
1009GB

md5_mixalpha-numeric-all-space#1-8
(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789 )
Вероятность подбора: 99.9%
1049GB

sha1_mixalpha-numeric#1-8
(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789)
Вероятность подбора: 99.9%
127GB

sha1_mixalpha-numeric#1-9
(ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789)
Вероятность подбора: 96.8%
690GB

 

Конфигурация железа в данной генерации:

Основной просчет ведется на 2-х GPU, но для тестов производительности доступен также вариант с прогоном на CPU.

 

Производительность для 1 хэша

В текущей конфигурации скорость вычислений доходит до:

8.96E+12 (Plaintexts per Second) на 2-х GPU GeForce GTX 680

9.21E+11 (Plaintexts per Second) при использовании CPU i7 4790.

Открыт ограниченный бесплатный 🙂 доступ по адресу: http://891rpm.com/rc/

0. [2016-01-20] Доступ предоставляется по запросу на странице сервиса.
1. [2016-01-20] Введено ограничение на количество одновременных запусков тестов.
2. [2016-01-26] Введено ограничение на обращение к сервису с одного IP.

В планах:

0. Добавить кириллицу в таблицы
1. Добавить алгоритмы RIPEMD-160 и MySQL SHA1

P.S. Front-End для сервиса (для своей тренировки) написан на Django.
Позже выложу исходники 🙂

Визуальное распознавание хэшей

john-to-crack-the-password

13-символьный хэш:

DES (UNIX)

 

16-символьный хэш:

MySQL

 

32-символьные хэши:

без соли: md5 или md5($md5)

с солью 2 символа: md5($salt.$pass)

с солью 3,30 символов: md5(md5($pass).$salt)

с солью 5,8 символов: md5(md5($salt).md5($pass))

с солью 16,32 символа: md5($pass.$salt)

 

40-символьные хэши:

MySQL 5

признак: верхний регистр символов

SHA-1

признак: нижний регистр символов

​SHA1($username.$pass)

признак: наличие 4-символьной соли, обязательно наличие имени пользователя (username)

 

Другие хэши:

MD5 (UNIX)

признак: наличие $1$ в начале хэша

MD5 (WordPress)

признак: наличие $P$B или $P$9 в начале хэша

MD5 (PHPBB3)

признак: наличие $H$7 или $H$9 в начале хэша

​MD5 (APR)

признак: наличие $apr1$ в начале хэша

​OpenBSD Blowfish

признак: наличие $2a$ в начале хэша

SHA-256 (UNIX)

признак: наличие $5$ в начале хэша

SHA-512 (UNIX)

признак: наличие $6$ в начале хэша

Безопасный метод авторизации на PHP

Давайте посмотрим вокруг: форумы, интернет магазины, гостевые книги и т.д. используют регистрацию и последующую авторизацию пользователей. Можно даже сказать, что это почти необходимая функция каждого сайта (только если это не домашняя страничка Васи Пупкина или не визитная карточка, какой-нибудь небольшой компании). Сегодня я хочу поделиться со всеми новичками информацией, о том, как лучше это все реализовать.

1. Модель (клиент) 
Регистрация
— логин (a-z0-9)
— пароль
Вход
— логин
— пароль
Cookie
— уникальный идентификатор юзера
— хэш
Модель (сервер) MySQL
Таблица users
user_id (int(11))
user_login (Varchar(30))
user_password (varchar(32))
user_hash (varchar(32))
user_ip (int(10)) по умолчанию 0При регистрации в базу данных записываеться логин пользователя и пароль(в двойном md5 шифровании)

При авторизация, сравниваеться логин и пароль, если они верны, то генерируеться случайная строка, которая хешируеться и добавляеться в БД в строку user_hash. Также записываеться IP адрес пользователя(но это у нас будет опциональным, так как кто-то сидит через Proxy, а у кого-то IP динамический… тут уже пользователь сам будет выбирать безопасность или удобство). В куки пользователя мы записываем его уникальный индетификатор и сгенерированный hash.

Почему надо хранить в куках хеш случайно сгенерированной строки, а не хеш пароля?
1. Из-за невнимательности программиста, во всей системе могут быть дырки, воспользовавшийсь этими дырками, злоумышленик может вытащить хеш пароля из БД и подставить его в свои куки, тем самым получить доступ к закрытым данным. В нашем же случае, двойной хеш пароля не чем не сможет помочь хакеру, так как расшифровать он его не сможет(теоретически это возможно, но на это он потратит не один месяц, а может быть и год) а воспользоваться этим хешем ему негде, ведь у нас при авторизации свой уникальный хеш прикрепленный к IP пользователя.
2. Если злоумышленик вытащит трояном у пользователя уникальный хеш, воспользовать им он также не сможет(разве если только, пользователь решил принебречь своей безопастностью и выключил привязку к IP при авторизации).

2. Практика
--
— Структура таблицы users

CREATE TABLE users (
user_id int(11) unsigned NOT NULL auto_increment,
user_login varchar(30) NOT NULL,
user_password varchar(32) NOT NULL,
user_hash varchar(32) NOT NULL,
user_ip int(10) unsigned NOT NULL default '0',
PRIMARY KEY (user_id)
) ENGINE=MyISAM DEFAULT CHARSET=cp1251 AUTO_INCREMENT=1 ;

register.php 
<?
// Страница регситрации нового пользователя

# Соединямся с БД
mysql_connect(«localhost»«myhost»«myhost»);
mysql_select_db(«testtable»);

if(isset($_POST[‘submit’]))
{
$err = array();

# проверям логин
if(!preg_match(«/^[a-zA-Z0-9]+$/»,$_POST[‘login’]))
{
$err[] = «Логин может состоять только из букв английского алфавита и цифр»;
}

if(strlen($_POST[‘login’]) < or strlen($_POST[‘login’]) > 30)
{
$err[] = «Логин должен быть не меньше 3-х символов и не больше 30»;
}

# проверяем, не сущестует ли пользователя с таким именем
$query mysql_query(«SELECT COUNT(user_id) FROM users WHERE user_login='».mysql_real_escape_string($_POST[‘login’]).«‘»);
if(
mysql_result($query0) > 0)
{
$err[] = «Пользователь с таким логином уже существует в базе данных»;
}

# Если нет ошибок, то добавляем в БД нового пользователя
if(count($err) == 0)
{

$login $_POST[‘login’];

# Убераем лишние пробелы и делаем двойное шифрование
$password md5(md5(trim($_POST[‘password’])));

mysql_query(«INSERT INTO users SET user_login='».$login.«‘, user_password='».$password.«‘»);
header(«Location: login.php»); exit();
}
else
{
print 
«<b>При регистрации произошли следующие ошибки:</b><br>»;
foreach(
$err AS $error)
{
print 
$error.«<br>»;
}
}
}
?>

<form method=»POST»>
Логин <input name=»login» type=»text»><br>
Пароль <input name=»password» type=»password»><br>
<input name=»submit» type=»submit» value=»Зарегистрироваться»>
</form>

login.php

<?
// Страница авторизации

# Функция для генерации случайной строки
function generateCode($length=6) {
$chars «abcdefghijklmnopqrstuvwxyzABCDEFGHI JKLMNOPRQSTUVWXYZ0123456789»;
$code «»;
$clen strlen($chars) — 1;  
while (strlen($code) < $length) {
$code .= $chars[mt_rand(0,$clen)];  
}
return 
$code;
}

# Соединямся с БД
mysql_connect(«localhost»«myhost»«myhost»);
mysql_select_db(«testtable»);

if(isset($_POST[‘submit’]))
{
# Вытаскиваем из БД запись, у которой логин равняеться введенному
$query mysql_query(«SELECT user_id, user_password FROM users WHERE user_login='».mysql_real_escape_string($_POST[‘login’]).«‘ LIMIT 1»);
$data mysql_fetch_assoc($query);

# Соавниваем пароли
if($data[‘user_password’] === md5(md5($_POST[‘password’])))
{
# Генерируем случайное число и шифруем его
$hash md5(generateCode(10));

if(!@$_POST[‘not_attach_ip’])
{
# Если пользователя выбрал привязку к IP
# Переводим IP в строку
$insip «, user_ip=INET_ATON(‘».$_SERVER[‘REMOTE_ADDR’].«‘)»;
}

# Записываем в БД новый хеш авторизации и IP
mysql_query(«UPDATE users SET user_hash='».$hash.«‘ «.$insip.» WHERE user_id='».$data[‘user_id’].«‘»);

# Ставим куки
setcookie(«id»$data[‘user_id’], time()+60*60*24*30);
setcookie(«hash»$hashtime()+60*60*24*30);

# Переадресовываем браузер на страницу проверки нашего скрипта
header(«Location: check.php»); exit();
}
else
{
print 
«Вы ввели неправильный логин/пароль»;
}
}
?>
<form method=»POST»>
Логин <input name=»login» type=»text»><br>
Пароль <input name=»password» type=»password»><br>
Не прикреплять к IP(не безопасно) <input type=»checkbox» name=»not_attach_ip»><br>
<input name=»submit» type=»submit» value=»Войти»>
</form>

check.php

<?
// Скрипт проверки

# Соединямся с БД
mysql_connect(«localhost»«myhost»«myhost»);
mysql_select_db(«testtable»);

if (isset($_COOKIE[‘id’]) and isset($_COOKIE[‘hash’]))
{
$query mysql_query(«SELECT *,INET_NTOA(user_ip) FROM users WHERE user_id = ‘».intval($_COOKIE[‘id’]).«‘ LIMIT 1»);
$userdata mysql_fetch_assoc($query);

if(($userdata[‘user_hash’] !== $_COOKIE[‘hash’]) or ($userdata[‘user_id’] !== $_COOKIE[‘id’])
or ((
$userdata[‘user_ip’] !== $_SERVER[‘REMOTE_ADDR’])  and ($userdata[‘user_ip’] !== «0»)))
{
setcookie(«id»«»time() — 3600*24*30*12«/»);
setcookie(«hash»«»time() — 3600*24*30*12«/»);
print 
«Хм, что-то не получилось»;
}
else
{
print 
«Привет, «.$userdata[‘user_login’].«. Всё работает!»;
}
}
else
{
print 
«Включите куки»;
}
?>

Для защиты формы логина от перебора, можно использовать капчу.

Хочу отметить, что здесь я рассматривал авторизацию основоную на cookies, не стоит в комментариях кричать, что сессии лучше/удобнее и т.д. Спасибо.

Примечания:
1. mysql_select_db(«testtable»); // нелогичное название базы, testdb лучше
2. Нужно использовать mysql_real_escape_string()
3. Убирать лишние пробелы нет смысла, так как их не пропустит вот эта строка:
if(!preg_match(«/^[a-zA-Z0-9]+$/»,$_POST[‘login’]))

IPSec на Zyxel ZyWALL 35 EE

На тест попались маршрутизаторы Zyxel ZyWALL 35 EE, решил опытом их использования поделиться с читателями..

Тестирование ZyWALL 35 <=>ZyWALL 35

1. Настройка сети в соответствии с топологией тестового стенда:

Комп (192.168.1.100) >
[ZyWALL 35 (192.168.1.1) (10.210.210.106)] >
Коммутатор L2 Planet FSD-1600 >
[ZyWALL 35 (10.210.210.107)(192.168.100.1)] >
Комп (192.168.100.7)

Настройки ZyWALL’ов (в два столбца): 192.168.100.1 / 192.168.1.1


Настройка LAN:

Настройка WAN:

Общий вид настроек VPN:

Настройка VPN-шлюзов:

Настройка VPN-туннелей:

В данной схеме (Комп (WinXP) > ZyWALL > Planet > ZyWALL > Комп (Debian)) с использованием аналогичных настроек VPN-шлюзов и VPN-туннелей:

IKE:
1. Режим работы: Main
2. Шифрование: AES-128
3. Аутентификация: SHA1
4. Ключ группы: DH2

IPSec:
0. Инкапсуляция: Tunnel

1. Протокол: ESP
2. Шифрование: AES-128
3. Аутентификация: SHA1

Максимальная пропускная способность канала составила около 23 Mbps (Win2Lin)/ 25 Mbps (Lin2Win) стабильно же держалась на уровне 22 Mbps (Win2Lin)/ 24 (Lin2Win).

IKE:
1. Режим работы: Main
2. Шифрование: 3DES
3. Аутентификация: MD5
4. Ключ группы: DH2

IPSec:
0. Инкапсуляция: Tunnel

1. Протокол: ESP
2. Шифрование: 3DES
3. Аутентификация: MD5

Максимальная пропускная способность канала составила около 23 Mbps (Win2Lin)/ 25 Mbps (Lin2Win) стабильно же держалась на уровне 23 Mbps (Win2Lin)/ 24 (Lin2Win).

Заявлено Zyxel’ем было 40 Mbps (конечно, погрешность может вносить Planet FSD-1600).

Производительность CPU устрйства составила ~40% при сетевой нагрузке в 10 Mbps и 100% при 25 Mbps.

Измерения нагрузки канала проводились с помощью nuttcp.

Тестирование Комп <=>ZyWALL 35, используя ZyWALL IPSec VPN Client

Общий вид настроек VPN:

Настройка VPN-шлюзов:

Настройка VPN-туннелей:

Далее настраиваем ZyWAL IPSec VPN Client:

При нажатии на «Открыть туннель «, при условии что все настройки туннеля и шлюза аналогичны на ZyWALL и на VPN-клиенте, создастся соотв. VPN-туннель.

В данной схеме (Комп (WinXP) > VPN-Client > Planet > ZyWALL 35 > Комп (WinXP)) с использованием аналогичных настроек VPN-шлюзов и VPN-туннелей:

IKE:
1. Режим работы: Main
2. Шифрование: AES-128
3. Аутентификация: SHA1
4. Ключ группы: DH2

IPSec:
0. Инкапсуляция: Tunnel

1. Протокол: ESP
2. Шифрование: AES-128
3. Аутентификация: SHA1

Максимальная пропускная способность канала составила около 15 Mbps, стабильно же держалась на уровне 9 Mbps.

1. Режим работы: Agressive
2. Шифрование: AES-128
3. Аутентификация: SHA1
4. Ключ группы: DH2

Максимальная пропускная способность канала составила около 12 Mbps, стабильно же держалась на уровне 8 Mbps.

1. Режим работы: Main
2. Шифрование: 3DES
3. Аутентификация: MD5
4. Ключ группы: DH2

Максимальная пропускная способность канала составила около 21 Mbps, стабильно же держалась на уровне 11 Mbps.

1. Режим работы: Agressive
2. Шифрование: 3DES
3. Аутентификация: MD5
4. Ключ группы: DH2

Максимальная пропускная способность канала составила около 18 Mbps, стабильно же держалась на уровне 11 Mbps.

Производительность CPU устройства составила ~35% при сетевой нагрузке в 10 Mbps и 70% при 25 Mbps.

Тестирование проводило с помощью ввода команд по обоим сторонам туннеля.