Да, если вы хэшируете одинаковую последовательность байтов на каждой платформе. Рассмотрим это, например:
$ 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
; который контролирует количество байтов случайных данных, которые используются.