1

嗨,有人使用 SHA512 iOS 实现吗?该代码似乎与我在 php 上生成的代码不同。

<?php

$code =  hash("SHA512", '123' . '123' );
echo $code;
?>

输出: 263fec58861449aacc1c328a4aff64aff4c62df4a2d50b3f207fa89b6e242c9aa778e7a8baeffef85b6ca6d2e7dc16ff0a760d59c13c238f6bcdc32f8ce9cc62

- (NSString *) sha512:(NSString *) input withSalt: (NSString *) salt {


const char *cKey  = [salt cStringUsingEncoding:NSUTF8StringEncoding];
const char *data = [input cStringUsingEncoding:NSUTF8StringEncoding];
unsigned char digest[CC_SHA512_DIGEST_LENGTH];
CCHmac(kCCHmacAlgSHA512, cKey, strlen(cKey), data, strlen(data), digest);

NSString *hash;

NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA512_DIGEST_LENGTH * 2];

for(int i = 0; i < CC_SHA512_DIGEST_LENGTH; i++)
    [output appendFormat:@"%02x", digest[i]];
hash = output;
return hash;

}

[self sha512:@"123" withSalt:@"123"];

输出: 3cafe40f92be6ac77d2792b4b267c2da11e3f3087b93bb19c6c5133786984b44

4

3 回答 3

3

您在 iOS 上使用 HMAC,您需要使用 SHA 并连接“123”和“123”,就像对 php 所做的一样。HMAC不仅仅连接密钥和数据。

采用: #import <CommonCrypto/CommonDigest.h>
extern unsigned char *CC_SHA512(const void *data, CC_LONG len, unsigned char *md)

于 2013-09-17T20:34:09.030 回答
2

您的代码有两个问题:

  1. 您的 ObjC 代码似乎正在计算 SHA512 HMAC,而您的 PHP 代码正在计算 SHA512哈希,它们是2 个不同的野兽。据我所知[不远]相应的PHP代码应该是这样的:

    hash_hmac('SHA512', '123',  '123' );
    
  2. 上面的输出仍然比 ObjC 代码长得多,即:

    0634fd04380bbaf5069c8c46a74c7d21df7414888d980c27a16d5e262cb8c9059139c212d0926000faf026e483904cefae2f5e9d9bd5f51fbc2ac4c4de518115
    

    这是 128 个字符 [512 位] 长,表面上是 SHA512 函数的预期长度。

于 2013-09-17T20:44:07.067 回答
-1

编辑了php代码:

hash_hmac('SHA512', '123',  '123' );

这解决了问题。谢谢!

于 2013-09-17T22:31:46.963 回答