Cerberus SFTP 服务器的自定义密码哈希函数
Custom password hashing function for Cerberus SFTP server
我正在尝试将用户从我们的旧 Cerberus SFTP 服务器迁移到新的 AWS Transfer Family SFTP 服务器。问题是我们的大多数 Cerberus 用户都有基于密码的身份验证,而我只能访问他们的单向散列密码。因此,我正在尝试对 Cerberus 对其密码进行哈希处理的方式进行逆向工程,这样我就不必要求我们的 100 多个客户提交新密码来使用或切换到基于 public 密钥的身份验证。
我看到这个博客 post,我认为它详细说明了如何做,但由于某种原因我似乎无法让它工作 - https://support.cerberusftp.com/hc/en-us/articles/360000040039-Securely-Storing-User-Passwords。
这是我到目前为止采取的步骤 -
- 在 Cerberus 中创建了一个密码为“asdf”的用户
- 已将我的用户集合导出到 CSV 文件
- 从导出中识别出散列密码如下 -
{{PBKDF2 HMAC SHA256}}:5000:42ED67592D7D80F03BF3E2413EB80718C5DAFEB5237FC4E5E309C2940DF1DBB2A4ABD9BB63B8AD285858B532A573D9DE
- 试图编写一个 Python 脚本,可以将“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)
documentation must've been written before the v7.0 PBKDF2 HMAC functions were adopted. The salt and the password are now used just as described in the documentation for PBKDF2.
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
,您可以看到它与条目末尾的散列值相匹配。
我正在尝试将用户从我们的旧 Cerberus SFTP 服务器迁移到新的 AWS Transfer Family SFTP 服务器。问题是我们的大多数 Cerberus 用户都有基于密码的身份验证,而我只能访问他们的单向散列密码。因此,我正在尝试对 Cerberus 对其密码进行哈希处理的方式进行逆向工程,这样我就不必要求我们的 100 多个客户提交新密码来使用或切换到基于 public 密钥的身份验证。
我看到这个博客 post,我认为它详细说明了如何做,但由于某种原因我似乎无法让它工作 - https://support.cerberusftp.com/hc/en-us/articles/360000040039-Securely-Storing-User-Passwords。
这是我到目前为止采取的步骤 -
- 在 Cerberus 中创建了一个密码为“asdf”的用户
- 已将我的用户集合导出到 CSV 文件
- 从导出中识别出散列密码如下 - {{PBKDF2 HMAC SHA256}}:5000:42ED67592D7D80F03BF3E2413EB80718C5DAFEB5237FC4E5E309C2940DF1DBB2A4ABD9BB63B8AD285858B532A573D9DE
- 试图编写一个 Python 脚本,可以将“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)
documentation must've been written before the v7.0 PBKDF2 HMAC functions were adopted. The salt and the password are now used just as described in the documentation for PBKDF2.
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
,您可以看到它与条目末尾的散列值相匹配。