【发布时间】:2018-07-26 13:51:24
【问题描述】:
我有一个加盐的 MD5 哈希:896501b1d2ed4ec4e2d3a6c69a672152,我的密码是:123321
我在其他网站上使用相同的密码测试并创建了几个用户帐户:123321,在 mySQL 中我看到相同的 MD5 哈希 896501b1d2ed4ec4e2d3a6c69a672152
这确认了即使使用不同的用户名、不同的注册日期等,Salt 也是相同的。
下面我设置了一个简单的(2 字符)Salt Find 测试用例,我知道 Salt+Password 并且脚本会找到 Salt:
Setup Test details:
Salt = 'Ac'
Password = '123321'
Salted password = 'Ac123321'
Hash of Salted pass = 'b60639eef9d7e85eab35e16f6d1ba6d6'
使用下面的代码我可以在上面找到这个盐:
#!/bin/bash
hashtofind=b60639eef9d7e85eab35e16f6d1ba6d6
password=123321
counter=0
for i in $(seq 48 122); do
counter=$((counter+1))
salt=$(printf "\\$(printf %o $i)")
saltedpass=$(printf "\\$(printf %o $i)$password")
hashtocheck=$(echo -n "$saltedpass" | md5)
echo "$counter"
if [ $hashtocheck = $hashtofind ]; then
echo "Found HASH!"
echo "hashtofind: $hashtofind"
echo "saltedpass: $hashtocheck"
echo "SALT: $salt"
echo "password: $password"
echo "Salt+Password: $saltedpass"
exit 1
fi
done
for i in $(seq 48 122); do
for j in $(seq 48 122); do
counter=$((counter+1))
salt=$(printf "\\$(printf %o $i)\\$(printf %o $j)")
saltedpass=$(printf "\\$(printf %o $i)\\$(printf %o $j)$password")
hashtocheck=$(echo -n "$saltedpass" | md5)
echo "$counter"
if [ $hashtocheck = $hashtofind ]; then
echo "Found HASH!"
echo "hashtofind: $hashtofind"
echo "saltedpass: $hashtocheck"
echo "SALT: $salt"
echo "password: $password"
echo "Salt+Password: $saltedpass"
exit 1
fi
done
done
for i in $(seq 48 122); do
for j in $(seq 48 122); do
for k in $(seq 48 122); do
counter=$((counter+1))
salt=$(printf "\\$(printf %o $i)\\$(printf %o $j)\\$(printf %o $k)")
saltedpass=$(printf "\\$(printf %o $i)\\$(printf %o $j)\\$(printf %o $k)$password")
hashtocheck=$(echo -n "$saltedpass" | md5)
echo "$counter"
if [ $hashtocheck = $hashtofind ]; then
echo "Found HASH!"
echo "hashtofind: $hashtofind"
echo "saltedpass: $hashtocheck"
echo "SALT: $salt"
echo "password: $password"
echo "Salt+Password: $saltedpass"
exit 1
fi
done
done
done
此代码在 10 秒内给出结果:
1398
1399
1400
1401
1402
Found HASH!
hashtofind: b60639eef9d7e85eab35e16f6d1ba6d6
saltedpass: b60639eef9d7e85eab35e16f6d1ba6d6
SALT: Ac
password: 123321
Salt+Password: Ac123321
我最初需要的 Salt 长度超过 2 个字符。
问题:除了运行多终端/shell 控制台之外,还有什么方法可以更快地运行这个过程?
【问题讨论】:
-
您所有的命令替换,即
saltedpass=$(...)都非常“昂贵”,因为$()必须启动一个新的shell 来处理那个语句。我认为您可以将所有循环的整个内容转换为一个 awk 脚本,然后为您无法避免的 1 个外部调用调用md5 | getline resultVar(或类似的)。祝你好运。 -
@shellter 谢谢你,删除
$()使它更快。