【问题标题】:HMAC SHA-512 generation discrepancies between iOS and javascript librariesiOS 和 javascript 库之间的 HMAC SHA-512 生成差异
【发布时间】:2017-07-04 20:29:56
【问题描述】:

我正在尝试使用 SHA-512 算法从我的 iOS 应用程序中复制 Hmac 生成行为,并引用此链接 Objective-C sample code for HMAC-SHA1

为此,我尝试使用CrytoJSjsSHA 库来使用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


【解决方案1】:

HMAC 接受一个数据键和一个键和数据参数,它们是字节,并返回由指定的哈希函数确定的长度的字节。

例子:

+ (NSData *)doHmacSha512:(NSData *)dataIn
                     key:(NSData *)key
{
    NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA512_DIGEST_LENGTH];

    CCHmac( kCCHmacAlgSHA512,
            key.bytes,
            key.length,
            dataIn.bytes,
            dataIn.length,
            macOut.mutableBytes);

    return macOut;
}

测试:

NSData *keyData  = [@"MyTestKey" dataUsingEncoding:NSASCIIStringEncoding];
NSData *data     = [@"Now is the time for all good computers to come to the aid of their masters." dataUsingEncoding:NSASCIIStringEncoding];
NSData *hamcData = [Crypto doHmacSha512:data key:keyData]; // Where "Crypto" is the class "doHmacSha512" is defined in.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-15
    • 2019-06-22
    • 2013-03-13
    • 2010-11-02
    • 2011-05-07
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    相关资源
    最近更新 更多