繁体   English   中英

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

[英]Are all md5 hashes the same?

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

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

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

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

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

为什么哈希不同? 因为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

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

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

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

是的,理论上应该有效。 MD5是一种散列算法,因此只要它使用MD5作为两端,它应该没有问题。

您可能还需要考虑其他更安全的哈希算法,例如SHA。 而且,正如上面的评论所暗示的那样,你应该总是为你的哈希加盐以增加额外的安全层......

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM