Как правильно использовать AES_ENCRYPT? - PullRequest
4 голосов
/ 02 апреля 2012

Я пытаюсь использовать шифрование AES ( AES_ENCRYPT в MySQL) для паролей пользователей, но я столкнулся с кучей разных проблем.

Это SQL-запрос, который я используючтобы сохранить нового пользователя в базе данных:

INSERT INTO user VALUES (
    '15',
    'John',
    'Doe',
    '123 Fake St.',
    AES_ENCRYPT('mypassword', 'mysalt'),
    'mysalt'
)

Где соль будет случайной строкой в ​​реальном случае.

Работает нормально.Я имею в виду, я могу восстановить оригинальный пароль.В этом примере AES_DECRYPT(user.password, 'mysalt') WHERE user.id = 15 возвращает mypassword.Но я могу упускать из виду некоторые вещи.

  • Безопасно ли сохранять соль вместе с паролем?Помимо безопасность через непонятную вещь .

  • В каком формате лучше хранить хешированный пароль?Я использую
    VARBINARY, но сохраненная строка выглядит как 8�p�����_�Z�\.

  • И, наконец, как долго должен быть пароль и сколько должна быть соль?

Спасибо

Ответы [ 3 ]

6 голосов
/ 02 апреля 2012

Как правило, нет необходимости в обратном шифровании пароля.Наличие этой способности по своей сути снижает безопасность системы.Вместо этого используйте необратимую хэш-функцию.Я предлагаю SHA-256 (или больше), который приводит к строковому результату:

 SHA2 (CONCAT (user.name, user.password, 'some salt', user.id), 256)

У меня также есть расстроенная масса радужных таблиц от любого использования при прокате вдругие данные всегда известны во время проверки пароля.

SHA2 требует MySQL 5.5 или более поздней версии.Если вы используете более раннюю версию, SHA1() почти так же хорош, и, как правило, намного лучше, чем MD5, AES и т. Д.

2 голосов
/ 13 мая 2013

Пожалуйста, рассмотрите возможность использования хэша пароля вместо криптографического хэша. Цели разные. См. https://security.stackexchange.com/a/6415/25424 для получения дополнительной информации. Структуры паролей, такие как упомянутые в https://stackoverflow.com/a/6337021/516813, позаботятся о многих деталях, таких как соление.

0 голосов
/ 02 апреля 2012

Вы должны не просто зашифровать пароль в базе данных, но и сохранить представление пароля в базе данных.

См. этот вопрос для подробного объяснения.

...