我正在尝试将用户从我们的传统Cerberus SFTP服务器迁移到新的AWS Transfer Family SFTP服务器。问题是我们的大多数Cerberus用户都有基于密码的身份验证,我所能访问的只是他们的单向散列密码。因此,我试图逆向工程Cerberus如何散列它的密码,这样我就不必要求我们的100多个客户提交一个新密码来使用或切换到基于公钥的身份验证。
我偶然看到这篇博客文章,我想详细说明如何做到这一点,但我似乎不能让它工作的原因- https://support.cerberusftp.com/hc/en-us/articles/360000040039-Securely-Storing-User-Passwords.
这是我到目前为止所采取的步骤-
- 在Cerberus中创建一个用户,密码为"asdf">
- 将我的用户集合导出到CSV文件
- 从导出中识别散列密码,如下所示-{{pbkdf2 hmac sha256}}:5000: 42ed67592d7d80f03bf3e2413eb80718c5dafeb5237fc5e309c2940df1dbb2a4abd9bb63b8ad285858b532a573d9de
- 试图编写一个可以散列"asdf"到与上面相同的哈希值
这是我的脚本到目前为止的样子- https://replit.com/@ryangrush/sample.
import hashlib
import base64
password = b'asdf'
salt = b'sample_salt'
combined = salt + password
first = hashlib.pbkdf2_hmac('sha256', combined, b'', 5000)
combined = salt + first
second = hashlib.pbkdf2_hmac('sha256', combined, b'', 5000)
base_16 = base64.b16encode(second)
print(second.hex())
print(base_16)
该文档必须是在采用v7.0 PBKDF2 HMAC函数之前编写的。现在按照PBKDF2文档中的描述使用salt和密码。
import hashlib
import base64
hashed_password_entry = '{{PBKDF2 HMAC SHA256}}:5000:42ED67592D7D80F03BF3E2413EB80718C5DAFEB5237FC4E5E309C2940DF1DBB2A4ABD9BB63B8AD285858B532A573D9DE'
entry_components_strings = hashed_password_entry.split(':')
password = b'asdf'
iterations = int(entry_components_strings[1])
salt_plus_hashvalue = base64.b16decode(entry_components_strings[2])
hash_len = 256 // 8
salt, hashvalue = salt_plus_hashvalue[:-hash_len], salt_plus_hashvalue[-hash_len:]
hashvalue_test = hashlib.pbkdf2_hmac('SHA256', password, salt, iterations)
print(hashvalue_test.hex())
输出是c5dafeb5237fc4e5e309c2940df1dbb2a4abd9bb63b8ad285858b532a573d9de
,您可以看到它与条目末尾的散列值相匹配。