вопрос генерации соли и хэша

Я просто хотел бы получить ваш отзыв о чем-то.

В основном у меня есть значение, называемое $uniqueID, которое равно ID + первая буква имени + первая буква фамилии + строка «CAN»

Затем я превратил $uniqueID в солт-значение следующим образом: $salt = sha1($uniqueID);

Затем я превратил пароль пользователя в хеш-значение, используя md5().

Затем я сохранил эти два значения отдельно в базе данных, используя правильные типы данных.

Мне просто интересно, будет ли это безопасным способом защитить два типа проверки пользователя? Проверка пароля будет выполняться пользователем, а $uniqueID будет выполняться с помощью скрипта.

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

Я также реализовал некоторую безопасность для сессий.


person Oliver Bayes-Shelton    schedule 03.03.2010    source источник
comment
Соль не следует использовать в качестве идентификатора и наоборот.   -  person Gumbo    schedule 03.03.2010
comment
может, мне сменить ID на дату регистрации?   -  person Oliver Bayes-Shelton    schedule 03.03.2010


Ответы (2)


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

Например, вы можете использовать rand и uniqid для создания случайной и уникальной соли для каждого пользователя:

$salt = uniqid(rand(), true);

Эта соль будет уникальной и случайной.

person Gumbo    schedule 03.03.2010
comment
Нет, просто псевдослучайный со слабой энтропией. - person Tower; 04.03.2010

Я бы рекомендовал использовать sha1 как в поле $uniqueID, так и в поле пароля.

Также не забудьте посолить поле пароля.

Кроме того, стоит отметить, что односторонние хэши могут получить одно и то же значение из разных входных данных. Как отмечает Гамбо, если вы планируете использовать $uniqueID в качестве уникального идентификатора, у вас возникнут проблемы. (Так что не надо ;-)

Если вы хотите использовать uniqueID в качестве сессионного ключа, вам нужно будет хотя бы проверить наличие коллизий перед его использованием. См. Zend.Session, CodeIgniter->сеанс и Кохона::Сессия

person Sean Vieira    schedule 03.03.2010
comment
как мне посолить поле пароля? - person Oliver Bayes-Shelton; 03.03.2010
comment
Точно так же, как вы солить поле ID ... соль - это дополнительный вход, который добавляется к входной строке перед ее хешированием. (Он может быть исправлен, сгенерирован или и то, и другое). Таким образом, вы можете использовать sha1("myS4lt" . $password . "in3cr4ckEr!"). Я бы просто использовал фиксированную соль, поскольку вы сделаете недействительными пароли, если разрешите пользователям изменять свои имена, и вы солят пароли с инициалами пользователя. - person Sean Vieira; 03.03.2010
comment
Так что, было бы лучше просто использовать sha1 для пароля и оставить $uniqueID как обычную строку? Я рассматриваю возможность повышения безопасности сеансов, чтобы проверить, является ли пользователь реальным пользователем? - person Oliver Bayes-Shelton; 03.03.2010
comment
Это зависит от того, для чего вы хотите использовать $uniqueID. Если вы планируете использовать его для своего сессионного ключа, вы, вероятно, все еще хотите его хешировать — просто дважды проверьте и убедитесь, что у вас нет коллизий. Я бы проверил несколько зрелых сессионных движков; например, сеансы Zend.Session и CodeIgniter и Kohona. Я добавлю ссылки в свой ответ. - person Sean Vieira; 03.03.2010