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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 20:25:17