Шифрование SHA - действительно ли нужны соли? - PullRequest
0 голосов
/ 10 августа 2011

Я использую Jquery SHA512.js для отправки шифрования и отправки имени пользователя и пароля на сервер.На сервере я делаю следующее, чтобы создать свою HASH, хранящуюся в БД:

$ dbhash = = hash ('sha256', (hash ('sha512', $ user). Hash ('sha256', $extremesalt)));

Все это прекрасно работает.

Мой вопрос: какое значение имеет соль?В тот момент, когда Соль применяется к паролю, пароль уже находится на сервере и не передается через Интернет.Также Соль хранится рядом с хешем пароля.

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

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

Еще один вопрос - можно ли применить соль из браузера к серверу.Я предполагаю, что нет или, по крайней мере, если бы вы это сделали, было бы видно, если бы кто-то проверил источник (например: в моем случае, видимом в jquery).Таким образом, не имеет реальной ценности.

thx

Ответы [ 4 ]

4 голосов
/ 10 августа 2011

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

При втором взгляде я вижу, что вы используете 2 хэша один за другим 256, а затем 512. Это плохая идея, используйте один и придерживайтесь его. Вы тратите время на вычисление нескольких хешей.

2 голосов
/ 10 августа 2011

Смешивать подобные хэши довольно бессмысленно.Взяв хэш sha512 и пропустив его через sha256, вы обязательно сократите пространство клавиш пополам, поэтому все, что вы сделали, - это потратили время процессора и удвоили шансы на столкновение.Шансы по-прежнему будут ничтожно малыми / микроскопическими, но это все же нужно учитывать.

Соль присутствует в качестве механизма прикрытия.Если по какой-то причине ваша база данных утечет (например, файл дампа «потерялся»), было бы тривиально сгенерировать радужную таблицу общих паролей sha256 / 512 и посмотреть, есть ли какие-либо обращения к вашей таблице.Есть хеш, чтобы сделать создание радуги намного дороже.Например, «пароль» легко хэшировать и проверять."пароль # ^ $ @ #% # ^ Y # @ # $ @ # ^% $ ^ Y %% $" с гораздо меньшей вероятностью будет радужным.

0 голосов
/ 10 августа 2011
$dbhash = = hash('sha256',(hash('sha512',$user) . hash('sha256',$extremesalt)));

Должно быть (нет необходимости в двойном хешировании)

$dbhash = = hash('sha512',$pass + $salt);

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

0 голосов
/ 10 августа 2011

Я не знаю ваше приложение, но разве вы не захотите просто отправить имя пользователя / pwd на сервер с использованием SSL и позволить шифрованию с открытым ключом SSL позаботиться о шифровании за вас. Затем сервер может сгенерировать соответствующий хеш для хранения хешированного пароля или сравнения с ранее сохраненным хешем для проверки.

...