Безопасность аутентификации веб-приложений Сергей Нартымов Brainspec https://github.com/lest twitter: @just_lest
Безопасность аутентификациивеб-приложений
Сергей НартымовBrainspec
https://github.com/lesttwitter: @just_lest
Хэш пароля
• MD5
• SHA-1
• SHA-2
Хэш с солью
Хэш с солью
• Пароль пользователя• Соль пользователя• Соль приложения
PBKDF2
Password-Based Key Derivation Function 2
PBKDF2DK = PBKDF2(PRF, Password, Salt, c, dkLen)
DK = T1 || T2 || ... || Tdklen/hlenTi = F(Password, Salt, Iterations, i)
F(Password, Salt, Iterations, i) = U1 ^ U2 ^ ... ^ Uc
U1 = PRF(Password, Salt || INT_32_BE(i))U2 = PRF(Password, U1)...Uc = PRF(Password, Uc-1)
DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
PBKDF2DK = PBKDF2(PRF, Password, Salt, c, dkLen)
DK = T1 || T2 || ... || Tdklen/hlenTi = F(Password, Salt, Iterations, i)
F(Password, Salt, Iterations, i) = U1 ^ U2 ^ ... ^ Uc
U1 = PRF(Password, Salt || INT_32_BE(i))U2 = PRF(Password, U1)...Uc = PRF(Password, Uc-1)
DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
PBKDF2DK = PBKDF2(PRF, Password, Salt, c, dkLen)
DK = T1 || T2 || ... || Tdklen/hlenTi = F(Password, Salt, Iterations, i)
F(Password, Salt, Iterations, i) = U1 ^ U2 ^ ... ^ Uc
U1 = PRF(Password, Salt || INT_32_BE(i))U2 = PRF(Password, U1)...Uc = PRF(Password, Uc-1)
DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
PBKDF2DK = PBKDF2(PRF, Password, Salt, c, dkLen)
DK = T1 || T2 || ... || Tdklen/hlenTi = F(Password, Salt, Iterations, i)
F(Password, Salt, Iterations, i) = U1 ^ U2 ^ ... ^ Uc
U1 = PRF(Password, Salt || INT_32_BE(i))U2 = PRF(Password, U1)...Uc = PRF(Password, Uc-1)
DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
PBKDF2DK = PBKDF2(PRF, Password, Salt, c, dkLen)
DK = T1 || T2 || ... || Tdklen/hlenTi = F(Password, Salt, Iterations, i)
F(Password, Salt, Iterations, i) = U1 ^ U2 ^ ... ^ Uc
U1 = PRF(Password, Salt || INT_32_BE(i))U2 = PRF(Password, U1)...Uc = PRF(Password, Uc-1)
DK = PBKDF2(HMAC−SHA1, passphrase, ssid, 4096, 256)
bcrypt
bcrypt
$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
идентификатор алгоритма
bcrypt
$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
сложность
bcrypt
$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
соль
bcrypt
$2a$10$vI8aWBnW3fID.ZQ4/zo1G.q1lRps.9cGLcZEiGDMVr5yUP1KUOYTa
PBKDF2
scryptbcrypt
504 Gateway Time-out
502 Bad Gateway
Перебор пользователей
Перебор пользователей
• Форма логина• Неверный адрес e-mail или пароль.
Перебор пользователей
• Форма восстановления пароля• Если ваш адрес e-mail есть в нашей базе данных, то в течение нескольких минут вы получите письмо с инструкциями по восстановлению вашего пароля.
Перебор пользователей
• Форма регистрации
Тайминговые атаки
Тайминговые атаки
• https://code.djangoproject.com/ticket/20760
Блокировка доступа
Блокировка доступа
• для пользователя• для IP-адреса
Блокировка доступа
• CAPTCHA
• разблокировка по ссылке из письма
Инвалидация сессии
Инвалидация сессии
• хранить в сессии данные, которые изменяются при изменении пароля
• проверять при доступе к сессии
Инвалидация сессии
• хранить сессии в БД• показывать активные сессии
Запомнить меня
Запомнить меня
• добавляем токен и время
• храним токен в HttpOnly cookie
Восстановление пароля
Восстановление пароля
• не стоит генерировать пароль и присылать его на почту
Восстановление пароля
• генерируем токен и отправляем на почту ссылку с этим токеном
• по ссылке показываем форму изменения пароля
Сложность пароля
Без пароля
Без пароля
• Одноразовые коды доступа
Без пароля
• Одноразовые коды доступа
• OpenID
Без пароля
• Одноразовые коды доступа
• OpenID
• OAuth
SSL
SSL
startssl.com
Двухэтапная аутентификация
Двухэтапная аутентификация
Двухэтапная аутентификация
Двухэтапная аутентификация
Двухэтапная аутентификация
Dropbox
Двухэтапная аутентификация
AWS
Dropbox
Двухэтапная аутентификация
AWS
Dropbox
GitHub
Двухэтапная аутентификация
Open Web ApplicationSecurity Project
• https://www.owasp.org/
• https://www.owasp.org/index.php/Cheat_Sheets
Спасибо
https://github.com/lesttwitter: @just_lest
Сергей НартымовBrainspec