【问题标题】:Wrong password when importing user into Firebase (password_hash using SHA256)将用户导入 Firebase 时密码错误(使用 SHA256 的密码哈希)
【发布时间】:2019-05-04 18:37:53
【问题描述】:

我们正在使用经过 SHA256 哈希处理的密码将用户从外部数据库迁移到 Firebase Auth。

我们目前尝试from firebase_admin import auth 导入用户。我们能够导入示例用户,但无法使用该用户登录(密码错误)。

这里是重现问题的最少代码 sn-ps。

  1. 我们以用户为例
  2. 我们使用 sha256 对密码进行哈希处理
  3. 运行import_users_to_firebase()
  4. 尝试使用示例用户登录 -> 密码无效

`

def hash_password(raw_password):
    import base64
    import hashlib
    algo = hashlib.sha256()
    algo.update(raw_password)
    return base64.b64encode(algo.digest())

def create_mock_user_data():
    email = 'test@example.com'
    password = 'test@example.com'
    password_hash = hash_password(password)
    print 'password_hash: {}'.format(password_hash)
    return email, password_hash


def import_users_to_firebase():
    mock_email, mock_password_hash = create_mock_user_data()
    users = [
        auth.ImportUserRecord(
            uid='someuid',
            display_name='Test example',
            email=mock_email,
            email_verified=False,
            password_hash=b'{}'.format(mock_password_hash),
        ),
        # users list can contain up to 1000 records
    ]
    hash_alg = auth.UserImportHash.sha256(rounds=0)
    result = auth.import_users(users, hash_alg=hash_alg)

    print('Successfully imported {0} users. Failed to import {1} users.'.format(
    result.success_count, result.failure_count))

    for err in result.errors:
        print('Failed to import {0} due to {1}'.format(
            users[err.index].uid, err.reason))

`

我在这里遗漏了什么或误解了什么吗?

有什么方法可以检查 password_hash 是否正确导入?或者有没有一种方法可以配置 Firebase 使用的散列算法,以便导入的密码与示例用户登录匹配?

【问题讨论】:

  • 密码不仅经过哈希处理,还经过加盐处理。否则,有人可以使用带有预先计算的哈希值的彩虹表,并通过查找密码哈希值来破解所有密码

标签: python firebase firebase-authentication firebase-admin


【解决方案1】:

非常感谢 Firebase 支持团队,我的问题得到了解决:) 诀窍是不要在 hash_password() 中进行 base64 编码或之后对其进行解码,因此它是一个原始字节序列。那就是

auth.ImportUserRecord(
    uid='someuid',
    display_name='Test example',
    email=mock_email,
    email_verified=False,
    password_hash=mock_password_hash, # <-- mock_password_hash is not base64 encoded
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-25
    • 1970-01-01
    • 2011-09-30
    • 1970-01-01
    • 2013-09-11
    • 2014-10-13
    • 2015-09-02
    • 1970-01-01
    相关资源
    最近更新 更多