You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何向Firebase导入SHA1哈希密码 解决登录INVALID_PASSWORD错误

问题根因

导入后密码校验失败是两处代码配置错误导致的:

  • 哈希值转Buffer的方式错误:直接调用Buffer.from(item.password)会把十六进制格式的哈希字符串按普通文本编码转成字节流,存储的是每个哈希字符的ASCII值,并非SHA1运算输出的原始二进制结果。你打印的Buffer开头是64 63 61 30,对应的就是字符'd'、'c'、'a'、'0'的ASCII编码,刚好和你存储的哈希串开头字符对应;转换后得到的Buffer长度是40字节,但标准SHA1哈希输出固定为20字节,明显不符合要求。
  • 哈希轮次配置错误:导入配置中设置的rounds: 80和旧系统逻辑不匹配,这个参数代表Firebase校验密码时会重复执行SHA1运算的次数,而你的旧系统仅对明文执行1次SHA1计算,配置80轮会导致两边计算出的哈希值完全不一致。
修复方法

修改两处代码即可解决问题:

  1. 转换passwordHash时指定编码格式为hex,将十六进制字符串解码为原始二进制哈希字节:
passwordHash: Buffer.from(item.password, 'hex')

修改后打印的Buffer长度会是20字节,符合SHA1哈希的长度要求。
2. 将哈希配置的rounds参数值改为1,匹配旧系统单次SHA1运算的逻辑:

hash: {
  algorithm: "SHA1",
  rounds: 1,
}
修正后的核心代码参考
async function run() {
  const items = await csv().fromFile(csvFilePath);
  const users = [];
  for (item of items) {
    users.push({
      uid: item.id,
      email: item.email,
      passwordHash: Buffer.from(item.password, 'hex'),
    });
  }
  admin
    .initializeApp({
      credential: cert(serviceAccount),
      databaseURL: "xxx",
    })
    .auth()
    .importUsers(users, {
      hash: {
        algorithm: "SHA1",
        rounds: 1,
      },
    })
    .then((results) => {
      results.errors.forEach((indexedError) => {
        console.log(indexedError.error.message);
        console.log(`Error importing user ${indexedError.index}`);
      });
    })
    .catch((error) => {
      console.log("Error importing users :", error);
    });
}

run();

修改完成后重新执行导入脚本,再使用原账号密码登录就不会返回INVALID_PASSWORD错误了。


内容的提问来源于stack exchange,提问作者user2993328

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 11:27:17