如何在AS3(AIR桌面端)计算与openssl结果一致的HMAC SHA256值
AS3 AIR桌面端HMAC SHA256计算实现方案
测试用例校验标准
你给出的Linux验证命令输出结果可作为校验基准:
[linux]$ echo -n "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559" | openssl dgst -sha256 -hmac "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"
(stdin)= c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71
核心实现代码
AS3中可通过as3crypto加密库的相关类实现,和openssl计算结果完全对齐的代码如下:
// 引入依赖类 import com.hurlant.crypto.hash.HMAC; import com.hurlant.crypto.hash.SHA256; import flash.utils.ByteArray; import com.hurlant.util.Hex; /** * 计算字符串的HMAC SHA256值,返回小写十六进制字符串 * @param inputStr 待加密的原始字符串 * @param secretKey 加密用的字符串密钥 * @return 计算结果,和openssl dgst命令输出格式一致 */ public function computeHmacSha256(inputStr:String, secretKey:String):String { // 将输入内容和密钥转为UTF-8编码字节流,和openssl默认编码规则对齐 var inputBytes:ByteArray = new ByteArray(); inputBytes.writeUTFBytes(inputStr); var keyBytes:ByteArray = new ByteArray(); keyBytes.writeUTFBytes(secretKey); // 初始化HMAC实例,使用SHA256算法 var hmacInstance:HMAC = new HMAC(new SHA256(), keyBytes); hmacInstance.update(inputBytes); // 将计算得到的字节流转为小写十六进制字符串 var resultBytes:ByteArray = hmacInstance.digest(); return Hex.fromArray(resultBytes).toLowerCase(); }
调用示例
var testInput:String = "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000×tamp=1499827319559"; var testSecret:String = "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"; var calcResult:String = computeHmacSha256(testInput, testSecret); trace(calcResult); // 输出:c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71
注意事项
- 必须使用
writeUTFBytes处理字符串转字节流,不要使用其他编码转换方式,否则会因编码不一致导致计算结果不匹配 - 最终输出需转为小写十六进制格式,和openssl默认输出规则对齐
- 依赖的as3crypto相关类可直接引入到项目中,无需额外外部服务依赖,可正常打包到AIR桌面端安装包
内容的提问来源于stack exchange,提问作者Simone Pinto
相关产品推荐
相关产品推荐

