Все ли хеши md5 одинаковы? - PullRequest
2 голосов
/ 25 января 2012

Если я создам хэш md5 для строки на одном компьютере с помощью скрипта bash, создаст ли эта же строка тот же хеш md5, если я создаю хэш md5 через скрипт php на другом компьютере?Я пытаюсь написать скрипт на одном компьютере и перенести его на другой.Этот скрипт создаст хэш md5 для пароля пользователя.Затем на отдельной веб-странице будет запрошено имя пользователя и пароль.Поскольку я не хочу хранить необработанный пароль, я бы хотел сохранить хеш, чтобы скрипт php вычислял хеш для пароля, который вводит пользователь, и предоставлял доступ, если они совпадают.Должно ли это работать теоретически или есть вопросы, которые мне нужно рассмотреть?

Ответы [ 3 ]

7 голосов
/ 25 января 2012

Да, контрольные суммы MD5 не зависят от платформы и каждый раз выдают одно и то же значение для одного и того же файла / строки / чего угодно.

Однако вы можете пересмотреть свою схему. По крайней мере, посолите ваши хеши. Существует множество советов по схемам хранения имен пользователей и паролей в StackOverflow.

6 голосов
/ 25 января 2012

Да, если вы хэшируете одинаковую последовательность байтов на каждой платформе. Рассмотрим это, например:

$ echo 'P4$$w0rd' | md5
9bb60af76b036e37a6d2626868c8c101
$ printf 'P4$$w0rd' | md5
640e5a3b9f9e4d667456c4e68194d6a2

Почему хэши разные? Потому что echo ставит символ новой строки (символ ascii LF) в конце строки, а printf - нет. Вы должны убедиться, что все платформы кодируют пароль одинаково (то есть ISO-8859-1 против UTF-8 против UTF-16 против UTF-8 с BOM ...), и если что-то добавлено (например, символ новой строки) он должен быть согласованным (например, Windows имеет тенденцию использовать CRLF в конце строк вместо просто LF ...).

Кроме того, как упоминал @Mitch Wheat, для хранения пароля вам действительно нужно посолить хеш (т.е. хешировать некоторые случайные данные вместе с паролем, а затем хранить случайные данные и хеш). Что-то более сильное, чем MD5, было бы хорошо, но это не так важно. Вот полная и быстрая реализация:

# generate the hash:
read -s -p "Enter a password:" password
echo
salt="$RANDOM"  # Really should use something more random here...
hashedpw="$salt,$(printf "%s|%s" "$salt" "$password" | md5)"

echo "The salted hash is $hashedpw"

# check the hash:
read -s -p "Try to reenter the password:" testpassword
echo
salt="${hashedpw%%,*}"
hashonly="${hashedpw#*,}"
if [ "$hashonly" = "$(printf "%s|%s" "$salt" "$testpassword" | md5)" ]; then
    echo "That was the same password"
else
    echo "That was not the same password"
fi

РЕДАКТИРОВАТЬ: вот лучший способ создания случайной соли, хотя, вероятно, она не так переносима:

salt="$(dd if=/dev/random bs=16 count=1 2>/dev/null | od -x | sed 's/^[0-9]*//' | tr -d $' \t\n')"

Если вы хотите еще больше случайности, просто увеличьте параметр bs=16; который контролирует количество байтов случайных данных, которые используются.

2 голосов
/ 25 января 2012

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

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

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