xcode ios HMAC SHA 256哈希

gdu*_*ubs 18 cryptography objective-c sha256 hmac ios

所以我想弄清楚如何在ios上做一个hmacshad256哈希,因为这是我为我所做的wcf服务api做的哈希.我一直在尝试寻找有关它的一些信息,但通常最终会得到一个SHA-256哈希.

这是我唯一的参考:

需要像Java一样在Objective C中生成HMAC SHA256哈希

而且我不确定这是否是唯一的方法(导入java hmac类)

任何帮助表示赞赏.

谢谢!

Jur*_*tas 33

NSString * parameters = @"string to hash"
NSString *salt = @"saltStringHere";
NSData *saltData = [salt dataUsingEncoding:NSUTF8StringEncoding];
NSData *paramData = [parameters dataUsingEncoding:NSUTF8StringEncoding];
NSMutableData* hash = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH ];
CCHmac(kCCHmacAlgSHA256, saltData.bytes, saltData.length, paramData.bytes, paramData.length, hash.mutableBytes);
NSString *base64Hash = [hash base64Encoding];
Run Code Online (Sandbox Code Playgroud)

并且

#import <CommonCrypto/CommonHMAC.h>
Run Code Online (Sandbox Code Playgroud)

由于从iOS 7.0 base64Encoding弃用,最后一行应该是:

NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
Run Code Online (Sandbox Code Playgroud)

  • 选择器现在是-base64EncodedStringWithOptions: (2认同)

Ale*_*one 6

这是我提交的解决方案,我从其他答案中汇总了这个问题:

通过更改CC_SHA256_DIGEST_LENGTH和kCCHmacAlgSHA256,可以轻松地将其调整为其他哈希类型.

如果您对此感兴趣,请查看CommonCrypto库中的CommonDigest.h文件.

#import <Foundation/Foundation.h>
#import <CommonCrypto/CommonCrypto.h>

+ (NSString *)hmac:(NSString *)plaintext withKey:(NSString *)key
{
    const char *cKey  = [key cStringUsingEncoding:NSASCIIStringEncoding];
    const char *cData = [plaintext cStringUsingEncoding:NSASCIIStringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    const unsigned char *buffer = (const unsigned char *)[HMACData bytes];
    NSMutableString *HMAC = [NSMutableString stringWithCapacity:HMACData.length * 2];
    for (int i = 0; i < HMACData.length; ++i){
        [HMAC appendFormat:@"%02x", buffer[i]];
    }

    return HMAC;
}
Run Code Online (Sandbox Code Playgroud)

这已经在iOS 8.x和iOS 7.x上进行了测试

  • 这是一个答案所以"在我的情况下"不适用.而不是使用`NSASCIIStringEncoding`只需使用`NSUTF8StringEncoding`. (4认同)
  • 这假设明文和密钥是 ASCII,这在当今多种语言甚至表情符号的环境中是非常严格的。请注意,@Juraj Antas 不需要 char 数组。此实现提供的唯一内容是十六进制输出而不是 Base64,值得一提的是,在答案的顶部。 (2认同)