如何向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轮会导致两边计算出的哈希值完全不一致。
修复方法
修改两处代码即可解决问题:
- 转换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
相关产品推荐
相关产品推荐

