1

有一个网站通过将主密码与网站名称(例如主密码=abc 和站点=google)连接起来生成密码,然后使用 SHA1 对其进行散列,然后使用 Base64 对生成的散列进行编码。我一直在尝试在 Bash 中实现它,但我做不到。我的意思是我可以,但我的结果与网站上的结果截然不同。帮助?

使用 JavaScript 生成密码的网站位于http://angel.net/~nic/passwd.sha1.html

这是我的 bash 脚本:

#!/bin/bash

CUT=8

echo -n "Enter your master password. "
read -s MASTER
echo -en "\nEnter the site's name. "
read SITE

PASS=$(echo -n $MASTER$SITE | sha1sum | sed -e 's/[ -]//g' | base64 | cut -b 1-$CUT)

echo $PASS | sed -e 's/[\/+=]//g'

我是 Stack Overflow 的新手,所以请告诉我是否违反了任何规则等...

4

3 回答 3

1

据我所知

password.value = b64_hmac_sha1(master.value, site.value).substr(0,8);

它并不完全连接和计算SHA1,而是为密钥和消息计算HMAC-SHA1

我不知道任何等效于 HMAC 计算的命令行,但是如果您不介意调用 perl,那将类似于

perl -MDigest::HMAC_SHA1 \
 -e "print Digest::HMAC_SHA1::hmac_sha1('$SITE','$MASTER')" \
| base64 | cut -c1-8
于 2009-12-27T22:22:21.683 回答
1

您可以使用该openssl命令计算 HMAC 摘要并转换为 base64,如下所示。

echo -n $SITE | openssl dgst -binary -sha1 -hmac $MASTER | openssl base64 | cut -c1-8
于 2009-12-27T22:46:15.477 回答
0

该脚本使用 hmac-sha1 算法而不是直接的 sha1 哈希。然后它只返回 base64 编码结果的前 8 个字符。

您可以在此处找到 hmac-sha1 的 bash/openssl 实现,或者您可以调用 php 的hash_hmac函数。

在 php 中,您可以执行以下操作:

password=`php -r "echo substr(base64_encode(hash_hmac('sha1', '$SITE', '$MASTER', true)), 0, 8);"`
于 2009-12-27T22:37:03.370 回答