【发布时间】:2017-07-04 20:29:56
【问题描述】:
我正在尝试使用 SHA-512 算法从我的 iOS 应用程序中复制 Hmac 生成行为,并引用此链接 Objective-C sample code for HMAC-SHA1。
为此,我尝试使用CrytoJS 和jsSHA 库来使用javascript 代码计算Hmac。我发现这些 javascript 库生成的 hmac 值与我使用 iOS 代码生成的值存在差异。
有人可以帮助我了解我在这里做错了什么吗?我有一种感觉,我弄乱了传递给这两种方法的键和计数器值的格式。
例如: key = "敏捷的棕狐跳过懒狗" 计数器 = 123
iOS代码生成的Hmac- 8d4b0f7c7f800ffd656829b98988048b49b08d0068f6fd33add8a02b6bce8097cdd3a69dc8292ec7cc04e15021afb4499afe4a292f8db082b2d253ddfe7d7015
由 javascript 库生成的 Hmac- 211935F67D87CBB6A98DE6A6D9D64F9AAF8DA5F09BF17F1B7E5BD46FCD9BEFBCD3585FB859BD042291AF5D79B6D92CF7B348CD6558A18AEF4328FAF344D63266
iOS 代码:
NSData *key = [key dataUsingEncoding:NSASCIIStringEncoding];
NSData *rawKeyData = [DataUtil rawDataFromHex:key];
//encode the counter
uint8_t tosign[8];
for (int i = sizeof(tosign) - 1; i >= 0; i--) {
tosign[i] = counter & 0xff;
counter >>= 8;
}
unsigned char cHMAC[CC_SHA512_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA512, [rawKeyData bytes], [rawKeyData length], tosign, sizeof(tosign), cHMAC);
NSData *hmac = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
return hmac;
javascript代码:
var hash = CryptoJS.HmacSHA512("123", "The quick brown fox jumps over the lazy dog");
【问题讨论】:
-
你能发布一些代码示例吗?不看实际代码很难判断是否有错误。
-
JS例子中添加的计数器在哪里?一般来说,无论语言如何,HmacSHA512("Message", "Secret Passphrase") 都应该是相同的。
-
另外,如果你在 JS 中添加计数器的字节表示,请小心,因为 JS 只有浮点数。
-
第一个问题,我先加了key,后加了counter。我也尝试过交换值。它仍然给了我完全不同的价值观。对于下一个问题,我将键和计数器都作为字符串传入。
-
1.你为什么这样做:
NSData *rawKeyData = [DataUtil rawDataFromHex:key];? 2. 为什么:unsigned char cHMAC[CC_SHA512_DIGEST_LENGTH];? 3.counter有什么意义? 4.你需要研究一下HMAC是什么以及它的参数。
标签: javascript ios hmac hmacsha1