AS3 HMAC SHA-256 用于 Adobe AIR(桌面版)

3
在 Actionscript 3 中,我需要计算一个数据(一个字符串,utf-8编码),使用一个秘钥(一个字符串,utf-8编码)。
以下是需要计算的数据(字符串):"symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559"。
以下是秘钥(字符串):"NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j"。
以下是计算结果(字符串):"c8db56825ae71d6d79447849e617115f4a920fa2acdcab2b053c4b2838bd6b71"。
请问有人能解决这个问题吗?(结果正确,但我不知道如何得到这个结果)
以下是我目前尝试过的内容:
// THE DATA
var dataToEncode:String = "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559";
var byteArrayOfDataToEncode:ByteArray = new ByteArray();
byteArrayOfDataToEncode.writeUTF(dataToEncode); // we write the string into the ByteArray
                    
// THE SECRET KEY
var secretKey:String = "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j";
var byteArrayOfSecretKey:ByteArray = new ByteArray();
byteArrayOfSecretKey.writeUTF(secretKey); // we write the secret key into the ByteArray
                    
// WE COMPUTE THE SIGNATURE
var HMAC_SHA256:HMAC = new HMAC(new SHA256());
var byteArrayOfResultSignature:ByteArray = HMAC_SHA256.compute(byteArrayOfSecretKey, byteArrayOfDataToEncode);                  
var resultSignature:String = byteArrayOfResultSignature.readUTF();
                    
// WE SHOW THE RESULT SIGNATURE
trace("The result signature is: "+resultSignature);

这个HMAC类是使用AS3Crypto库创建的: https://github.com/Atmosphere/ActionScript/blob/master/src/com/hurlant/crypto/hash/HMAC.as


很不幸,我已经有十年没有商业使用ActionScript了。我建议您也发布一个最小版本的尝试。希望其他人能够发现潜在的问题(例如整数类型溢出等)。我还会考虑替代库。这需要在浏览器中运行吗,还是可以通过Adobe集成运行时(AIR)执行?(如果是这样,检查本机扩展如cryptopp-ane可能值得一试) - George Profenza
谢谢George的评论。我该如何使用cryptopp-ane? - Simone Pinto
这是针对AIR(桌面版)的。不需要浏览器,是一个独立的桌面应用程序。 - Simone Pinto
如果你以前没有使用过AIR,我建议先完成一个简单的教程,以熟悉基础知识。然后尝试加载/使用一个简单的ANE扩展。(通过快速搜索我找到了这个教程,希望有更好的教程可用)。关于cryptopp-ane,预编译的.ane文件位于release文件夹中。另外,tester文件夹包含一个基本的示例应用程序。如果你的系统上没有Gradle,但可以将Main.as文件作为起点进行重用而不需要首选设置。 - George Profenza
有没有办法让我写的代码工作?我相信这只是与那些ByteArrays转换有关的小问题。你能看一下吗? :) 正如你所看到的,HMAC方法“compute”需要2个bytesArray作为参数。我认为这就是问题的原因。 - Simone Pinto
2
你正在将结果签名作为UTF字符串读取,而不是将其作为字节数组读取到十六进制字符串中,因此你得到了一些垃圾符号,而不是一系列十六进制数字。请查看https://stackoverflow.com/questions/24974043/as3-bytearray-to-hex-binary-hex-representation以获取某种解决方法。 - Vesper
1个回答

2

通过评论者的帮助,我找到了答案。

解决方案是 com.adobe.crypto 。

在 As3corelib 中有一个类(可以在此处下载:https://code.google.com/archive/p/as3corelib/downloads)。您需要通过“文件->动作脚本设置”导入这些文件夹,然后单击源路径,然后将“com”文件夹添加到其中。

您还需要下载 Adobe Flex SDK(因为 As3corelib 中的一些类使用 Flex SDK 中的一些实用程序类),解压缩它,然后包含 framework.swc 文件(搜索 adobe flex 文件夹中的文件,在 frameworks/libs 文件夹中),转到“文件->动作脚本设置”,然后单击库路径,然后将 framework.swf 添加到其中。

现在您已经准备好操作了,就像这样:

import com.adobe.crypto.*; // import this, to have access to the classes we need.

// then this code where you need it
var message:String = "symbol=LTCBTC&side=BUY&type=LIMIT&timeInForce=GTC&quantity=1&price=0.1&recvWindow=5000&timestamp=1499827319559";
var secretKey:String = "NhqPtmdSJYdKjVHjA7PZj4Mge3R5YNiP1e3UZjInClVN65XAbvqqM6A7H5fATj0j";
                    
var signature:String = HMAC.hash(secretKey, message, SHA256) ;
                    
trace("The signature is: "+signature);


希望这能有所帮助,祝你有美好的一天!

1
所以有一个几乎是现成的函数可以做你需要的事情,只是因为as3corelib缺乏文档而被掩盖了?太好了,发现得不错 :) - Vesper
呵呵。AS3,我们爱你! - Simone Pinto

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接