【发布时间】:2021-07-16 15:20:13
【问题描述】:
我正在尝试将用户(包括密码)从旧的 symfony 2 应用程序迁移到 firebase 身份验证(或 google 身份平台)。
在 symfony2 应用程序中,用户的密码使用带有盐的 sha512 进行哈希处理。我已经发现可以在 firebase (https://firebase.google.com/docs/auth/admin/import-users) 的文档中使用他们的密码和哈希来导入用户。然而,firebase 使用的 sha512 散列似乎与 symfony 使用的不一样。
对于旧的 symfony 项目,使用以下配置:
security:
encoders:
FOS\UserBundle\Model\UserInterface: sha512
通过查看源代码,我发现 symfony 给定了盐和密码 symfony 会产生这样的哈希:(在 python 代码中)
def get_hash(salt, password):
hash = password.encode('utf-8')
salted = hash + salt
hash = hashlib.sha512(salted).digest()
for i in range(1, 5000):
# symfony keeps adding salted for every iteration, this is something firebase does not it seems
hash = hashlib.sha512(hash + salted).digest()
return base64.b64encode(hash).decode('utf-8')
但是,当我像下面的代码一样导入它时,此代码不允许我登录。然而,它产生的哈希值与我在 symfony2 应用程序的数据库中的哈希值相同:
app = firebase_admin.initialize_app()
salt = '{test}'.encode('utf-8')
hash = get_hash(salt=salt, password='xyz')
print('calculated hash', base64.b64encode(hash))
users = [
auth.ImportUserRecord(
uid='foobar',
email='foo@bar.com',
password_hash=hash,
password_salt=salt
)
]
hash_alg = auth.UserImportHash.sha512(rounds=5000)
try:
result = auth.import_users(users, hash_alg=hash_alg)
for err in result.errors:
print('Failed to import user:', err.reason)
except exceptions.FirebaseError as error:
print('Error importing users:', error)
但是,当我使用以下功能时,我可以使用密码登录。
def get_hash(salt, password):
hash = password.encode('utf-8')
salted = salt + hash
hash = hashlib.sha512(salted).digest()
for i in range(1, 5000):
hash = hashlib.sha512(hash).digest()
return hash
我已经找到了一种方法来更改添加盐的顺序,但我无法在 firebase hash = hashlib.sha512(hash + salted).digest() 中找到这样的哈希方法。
现在似乎没有办法将我的密码迁移到 firebase,因为 symfony 的实现与 firebase 使用的有点不同。有谁知道一种方法来确保我仍然可以导入我当前的哈希值?这会很棒。
如果没有,还有什么替代方法?
-
是否可以让 firebase 向我自己的端点发出请求以验证密码。
-
另一种方法是尝试捕获登录过程并首先将其发送到我自己的端点,在后台设置密码,然后将请求发送到 firebase?
【问题讨论】:
标签: firebase