2013-10-05 4 views
1

Нам нужно хранить пароли (настоящая информация хранится в некоторой конкретной деловой информации, но ее можно сравнить с паролями, чтобы упростить вопрос). Пароли должны быть хэшированы/зашифрованы.Как хранить эту конфиденциальную информацию?

Мы не хотим, чтобы у вас были возможности прочитать пароли, но до сможете узнать, у кого есть тот же.

Что делать, если мы crypt() с хешем CRYPT_BLOWFISH, используя всегда ту же соль?

Как мы можем хэшировать/шифровать пароли и гарантировать, что если база данных будет скомпрометирована, злоумышленник не сможет их прочитать или расшифровать?

+2

Я был бы очень обеспокоен тем, проверял ли веб-сайт, был ли у меня тот же пароль, что и у другого пользователя. –

+0

@ Дагон: прочитайте снова первое предложение. – Toto

+0

Я прочитал его трижды, я все еще не уверен, что его пароли или нет. –

ответ

0

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

Проблема, по которой вы не можете использовать информацию, подобную паролю, заключается в том, что соль будет уникальной, и поэтому функция хэша приведет к несравнимым хэш-значениям.Если бы мы могли обойтись без соли, мы могли бы использовать хеш-функцию для вашей цели.

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

0

Для хранения конфиденциальной информации вам понадобится массив соли и байтов. Затем вы можете зашифровать пару с помощью главного ключа, сохраненного где-то еще, безопасно. Благодаря 2-фазному шифрованию вы можете откатывать свои ключи так часто, как нужно в целях безопасности. Ваше приложение должно быть в состоянии объединить фрагменты для сравнения данных.

1

С паролями вы всегда ищете хэш, вы не хотите их расшифровывать или их необходимо расшифровать. Таким образом, вы ищете сильный алгоритм хэширования, blowfish или SHA512, я бы предложил. Что касается вашего вопроса о сравнении разных паролей пользователей, то это значительно снизит общую безопасность системы.

Вы хотите включить случайную соль с каждым паролем, чтобы сделать невозможным предварительное вычисление хэшей, поэтому даже один и тот же пароль будет иметь другой хеш для каждого пользователя, иначе злоумышленник может выяснить, какой из пользователей использует тот же паролей и использовать их в своих интересах. Использование одной и той же соли для каждого пароля поражает ее цель, и ни один из них не позволяет использовать радужные таблицы, поэтому вам придется пожертвовать этой особенностью, если вы хотите создать безопасный дизайн приложения.

Edit: извините удален комментарий и отправил его в качестве ответа

Я полагаю, что если вы ищете компромисс вы будете смотреть на много хеширования итераций, возможно, с большой случайной солью, общей для всех паролей. Это должно гарантировать отсутствие каких-либо уже имеющихся предварительно просчитанных таблиц для взлома паролей и увеличения времени взлома. Цепочка алгоритмов также может быть вариантом, но вы можете столкнуться с проблемой производительности, если есть много пользователей. По сути, если вы по-прежнему хотите сравнить пароли пользователей, занять много времени, чтобы вычислить хеш, что должно радикально увеличить время взлома. Опять же, чтобы подчеркнуть, это был бы компромисс и определенно не самый эффективный и безопасный способ обойти эту проблему.

+0

Если мы можем сравнить хэши, это прекрасно. Нам не нужно знать, что такое * пароль, но * какая группа пользователей * имеет тот же пароль. – Toto

+0

@Toto, посмотрите на PHPass. Задача решена. – Jonast92

+0

@Toto: Да, я понимаю, однако, что все еще есть риск безопасности, с точки зрения безопасности вы не сможете сравнивать хэши паролей пользователей, если они были рассчитаны из одних и тех же строк ... Проверьте последний параграф моего ответа , –

0

С паролями я и многие другие на SO и других сайтах настоятельно рекомендую Bcrypt; Bcrypt - это алгоритм хэширования с интенсивным вычислением, который должен быть медленным и дорогостоящим для грубой силы.

Вы можете прочитать больше о Bcrypt на ответ здесь: How do you use bcrypt for hashing passwords in PHP?

Как для сравнения значений, вы не можете с Bcrypt, но вы можете проверить, если значение является правильным.

Смежные вопросы