我正在学习linux和php上的加密和解密。所以我对 openssl 以及它如何生成密码哈希有三个问题。
1-假设我用 linux 命令生成了一个密码
openssl passwd
我的第一个观察是,每次生成哈希值时,它都是不同的!这是为什么?是因为盐的原因吗?这是我的第一个问题。
2-现在我的第二个问题是关于测试这个密码。假设我想测试这个密码的正确性并得到一个二进制答案,无论它是否正确。我该如何使用 openssl 做到这一点?如果我的问题没有意义,那么有什么openssl passwd
用呢?
3-如果我使用散列加密我的密码openssl passwd
,并且每次添加随机盐时,openssl如何解密它(或任何其他程序)?
谢谢。
答案1
openssl 使用算法和盐来加密您的密码。如果您不提供盐,则会随机选择。
盐在结果哈希中给出。
例如
openssl passwd -1 foo
$1$pyuddMjp$3.deTnHdrVVVLoh5zkQ0B.
在哪里
- 1 是 proticol(这里是 md5)
- pyuddMjp 是盐
如果我想验证您是否知道 passwd(即 foo),我需要使用带有 salt 的 passwd 选项来比较结果哈希。
x=条
openssl passwd -1 -salt pyuddMjp $x $1$pyuddMjp$kNkQHWoF8WVh7Oxvae5YX1
与 x=foo
openssl passwd -1 -salt pyuddMjp $x $1$pyuddMjp$3.deTnHdrVVVLoh5zkQ0B。
答案2
首先openssl命令通常不用于加密密码。您可以在以下位置阅读有关 openssl 的信息:http://en.wikipedia.org/wiki/OpenSSL
在 Unix 系统上,密码是使用单向哈希加密的,因此无法解密它们以恢复原始密码。
在一种加密方式中,盐通常是预先确定的字符串或从纯文本版本生成的,例如前几个字符,您将使用它来重新生成哈希并比较两者。
你提到了php,你可以检查一下PHP 地穴功能以获取更多信息。
答案3
建立在已接受的答案的基础上。我想验证密码哈希是否与最初设置的密码匹配 - 或者想法要设置。
首先,我不希望密码显示在命令行历史记录中,所以对于
# cat > pass.txt
mypasswd1
<ctrl>+d
# cat > badpass.txt
faulty
<ctrl>+d
然后我创建一个 MD5 哈希值:
# RET=$(openssl passwd -1 -in pass.txt)
# echo $RET
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
“salt”是第三个字段,由 $ 分隔(包括前导/空字段)。节约“盐”
# SALT=$(echo $RET | cut -d\$ -f 3)
# echo $SALT
nhyuaE7S
因此,为了查看密码是否确实与 MD5 哈希值匹配,我将$RET
变量中保存的哈希值与“test”的第一行进行比较。
# echo "$RET" ; openssl passwd -1 -salt "$SALT" $(cat pass.txt) "$RET"
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
$1$nhyuaE7S$3pGvIF7UwuvhJjXzR4Yb.0
它们看起来很匹配,让diff
我们检查一下:
# diff <(echo "$RET") <(openssl passwd -1 -salt "$SALT" $(cat pass.txt) "$RET" | head -1)
# echo $?
0
到目前为止一切顺利,但让我们也检查一下“错误”密码,看看我们没有匹配的密码。
# echo "$RET" ; openssl passwd -1 -salt "$SALT" $(cat badpass.txt) "$RET"
$1$nhyuaE7S$ld2wuucUlRUQE8iAnJhjF/
$1$nhyuaE7S$t6MTdY2QafzUtBMMVzf5B.
$1$nhyuaE7S$3pGvIF7UwuvhJjXzR4Yb.0
# diff <(echo "$RET") <(openssl passwd -1 -salt "$SALT" $(cat badpass.txt) "$RET" | head -1) >/dev/null
# echo $?
1
所以现在我们有一个测试,它实际上可以“证明”存储的 MD5 哈希值(即在配置文件中)与我们的密码匹配思考是正确的。
如果我的假设有任何错误或不正确,请在评论中告知。