所有md5哈希都是一样的吗?

Wil*_*ill 2 php security bash md5

如果我使用bash脚本在一个cpmputer上为字符串创建md5哈希,那么如果我通过另一台计算机上的php脚本调用md5哈希,那么同一个字符串会创建相同的md5哈希吗?我正在尝试在一台计算机上编写脚本并将其移植到另一台计算机上.该脚本将为用户密码创建md5哈希.然后,单独的网页将要求输入用户名和密码.因为我不想存储我希望存储哈希的原始密码,所以让php脚本计算用户输入的密码的哈希值,并在它们匹配时授予访问权限.这在理论上是否有效,或者是否存在我需要考虑的问题?

gre*_*reg 7

是的,MD5校验和是平台无关的,每次在同一个文件/字符串/无论什么时都会产生相同的值.

但是,您可能想重新考虑您的计划.至少盐你的哈希.StackOverflow上有很多关于用户名/密码存储方案的建议.


Gor*_*son 6

是的,前提是您在每个平台上散列相同的字节序列.考虑一下,例如:

$ echo 'P4$$w0rd' | md5
9bb60af76b036e37a6d2626868c8c101
$ printf 'P4$$w0rd' | md5
640e5a3b9f9e4d667456c4e68194d6a2
Run Code Online (Sandbox Code Playgroud)

为什么哈希不同?因为echo在字符串的末尾添加换行符(ascii LF字符),而printf没有.您需要确保所有平台都以相同的方式编码密码(即ISO-8859-1与UTF-8对比UTF-16与带有BOM的UTF-8 ...),如果有任何添加(如它应该是一致的(例如,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
Run Code Online (Sandbox Code Playgroud)

编辑:这是生成随机盐的更好方法,虽然它可能不那么便携:

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

如果你想要更多的随机性,只需增加bs=16参数; 它控制使用的随机数据的字节数.