如何将PHP crypt生成的MD5哈希密码导入Google Cloud Identity Platform
核心问题
你使用PHP crypt() 生成的$1$开头的哈希属于 MD5-Crypt 算法,和你当前配置的普通MD5是完全不同的两种哈希规则,这是导入后验证失败的根本原因。
正确配置说明
MD5-Crypt的格式为$1$<salt>$<hash_body>,你示例中的哈希$1$AT$JGYIRSP7xIYmg1XSoJmvB1对应参数拆分如下:
- 算法标识:
1,对应GCP Identity Platform导入参数的CRYPT_MD5算法 - 盐值:
AT,不需要携带任何$符号 - 哈希体:末尾的
JGYIRSP7xIYmg1XSoJmvB1
修正后的导入代码
var admin = require('firebase-admin'); var app = admin.initializeApp({ credential: admin.credential.applicationDefault() }); admin .auth() .importUsers( [ { uid: '31', email: 'user31@test.test', // 传入MD5-Crypt哈希体的二进制内容 passwordHash: Buffer.from('JGYIRSP7xIYmg1XSoJmvB1', 'base64'), // 盐值仅传入纯文本AT passwordSalt: Buffer.from('AT'), }, ], { hash: { // 算法改为CRYPT_MD5,匹配PHP crypt生成的$1$格式哈希 algorithm: 'CRYPT_MD5', // MD5-Crypt默认迭代1000轮,无需修改 rounds: 1000, }, } ) .then((results) => { console.log(results); results.errors.forEach((indexedError) => { console.log(`Error importing user ${indexedError.index}`); }); }) .catch((error) => { console.log('Error importing users :', error); });
之前配置错误的原因
- 普通
MD5算法是直接对输入密码做哈希,没有加盐迭代逻辑,和MD5-Crypt结果完全不匹配 - BCRYPT算法对应
$2$/$2a$开头的哈希格式,和你当前的$1$格式不兼容 - 盐值不需要携带
$符号,多余的符号会导致盐值不匹配,哈希验证失败
内容的提问来源于stack exchange,提问作者rickjerrity
相关产品推荐
相关产品推荐

