expo-crypto与Node crypto模块哈希值不一致问题求助
Node.js crypto与Expo crypto哈希结果不一致的原因及解决方案
原因
核心差异在于字符串转字节的编码逻辑:
- Node.js的
crypto.createHash('sha512').update(randomData)默认将字符串按UTF-8编码转换为字节后哈希。 - Expo的
Crypto.digestStringAsync未指定编码时,默认使用JavaScript字符串原生的**UTF-16(UCS-2)**编码转换字节,导致两端处理的原始字节序列完全不同,最终哈希结果不一致。
解决方案
方案1:Expo对齐Web端(推荐)
在Expo代码中显式指定UTF-8编码,确保和Node.js处理逻辑一致:
import Crypto from 'expo-crypto' const randomData = 'XTXpQWATVzlHSp2ZjvmoAfvXYDtT3O1q4SYFIDyPXardJhiLbC/tiw=='; const hashedValue = await Crypto.digestStringAsync( Crypto.CryptoDigestAlgorithm.SHA512, randomData, { encoding: 'utf8' } );
方案2:Web端对齐Expo
若需Web端适配Expo默认行为,可在Node.js代码中指定UCS-2编码:
const randomData = 'XTXpQWATVzlHSp2ZjvmoAfvXYDtT3O1q4SYFIDyPXardJhiLbC/tiw=='; const hashedValue = crypto.createHash('sha512').update(randomData, 'ucs2').digest('hex');
两种方案均可实现两端哈希结果一致,优先选择方案1(UTF-8为通用文本编码规范,兼容性更强)。
内容的提问来源于stack exchange,提问作者Ríkharður Friðgeirsson
相关产品推荐
相关产品推荐

