2009-10-19 2 views
0

Привет, я хочу, чтобы у вас были ваши данныеэто нормально? соление

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

uniqid(mt_rand()); 

Затем я использую md5 хэш соль, пароль и адрес электронной почты (в таком порядке) вместе, как пароль и перефразировать при входе в систему.

md5($salt . $password . $email); 

Насколько безопаснее, чем просто md5? Что-то я могу улучшить?

CREATE TABLE IF NOT EXISTS `users` (
`id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT, 
`username` varchar(24) CHARACTER SET utf8 NOT NULL, 
`password` varchar(32) CHARACTER SET utf8 NOT NULL, 
`email` varchar(255) CHARACTER SET utf8 NOT NULL, 
`salt` varchar(255) CHARACTER SET utf8 NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `username` (`username`), 
UNIQUE KEY `email` (`email`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 
+5

Этот вопрос очень похож: http: // stackoverflow.ru/вопросы/1584825/change-from-md5-to-sha1-salting/1585305 и http://stackoverflow.com/questions/1581610/help-me-make-my-password-storage-safe/1581919# 1581919 – Jacco

+0

Вы можете улучшить, не используя MD5 в качестве своего алгоритма хэширования. Есть ли причина, по которой вы выбрали эту? – mrduclaw

+0

«безопаснее» в каком отношении? см. http://stackoverflow.com/questions/420843/421147#421147 – hop

ответ

4

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

$hashed = md5($per_user_salt . $password . $app_salt); 
+2

Я бы не использовал MD5 – Jacco

+2

Ни я, ни другие ответы уже не упоминали эту проблему, поэтому я обратился к другой. – tvanfosson

-1

Они никогда не будут пачкаться.

.... возможно один раз в 10000000000000000.

+2

Это как-то не кажется математически правильным. Могу ли я увидеть статистику, которая поддерживает этот номер? – mrduclaw

+3

Я только один, кто читал это число как двоичный? >. < – Pondidum

+0

может быть? Для 500000000 солей, взятых из диапазона 0-2^32, вероятность столкновения составляет более 30%. – xtofl

13

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

+0

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

3

getrandmax, кажется, возвращает довольно большое число (2147483647), в зависимости от платформы. Вероятность того, что вы встретите какое-либо данное N, - это, следовательно, 1/2147483647.

Шанс, что вы не встретите N, равен 1-1/2147483647.

Итак, вероятность того, что вы не столкнетесь с первой, во-вторых, в-третьих, ... Pth N становится степенью Pth (1-1/2147483647).

Так что шанс вы сделать встречи один из P распределенных солей 1 - (шанс, что вы не сталкиваются с какой-либо из P солей)

= 1 - (1-1/макс) ** P

Это означает, что кривая круто падает примерно с четверти солидных концертов. (таблица из Excel):

     max 
          2,147,483,647 
      P = number/salts  (1 - 1/max)^P  collission chance 
       16777216     0     1% 
       33554432     0     2% 
       67108864     0     3% 
       134217728     0     6% 
       268435456     0     12% 
       536870912     0     22% 
      1073741824     0     39% 
      2147483648     0     63% 
      4294967296     0     86% 
      8589934592     0     98% 
      17179869184     0     100% 
0

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

$ hashed = hash ('sha256', $ per_user_salt. $ Password. $ App_salt);

Примечание: для этого требуется PHP 5.1.2 или выше.