【问题标题】:xcode ios HMAC SHA 256 hashingxcode ios HMAC SHA 256 哈希
【发布时间】:2013-01-09 02:03:02
【问题描述】:

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

这是我唯一的参考资料:

Need to generate HMAC SHA256 hash in Objective C as in Java

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

感谢任何帮助。

谢谢!

【问题讨论】:

标签: ios objective-c cryptography hmac sha256


【解决方案1】:
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];

还有

#import <CommonCrypto/CommonHMAC.h>

由于base64Encoding is deprecated来自iOS 7.0,最后一行应该是:

NSString *base64Hash = [hash base64EncodedStringWithOptions:0];

【讨论】:

  • 选择器现在是 -base64EncodedStringWithOptions:
  • 请编辑你的答案,并写下我们需要添加#import "NSData+Base64.h"
  • @Stebra 好吧,你不需要导入 NSData+Base64.h。你可以把这段代码放在你想要的任何地方。但确实,让类别扩展 NSData 可能是最好的方法。
  • 由于盐通常是公开的,这可能会产生误导。这实际上是您应该在那里使用的密钥!
【解决方案2】:

这是我提交的解决方案,是我从有关此事的其他答案中汇总而成的:

通过更改 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;
}

这已经在 iOS 8.x 和 iOS 7.x 上测试过

【讨论】:

  • 这假设明文和密钥是ASCII,这在当今许多语言甚至表情符号的环境中是非常严格的。请注意,@Juraj Antas 不需要 char 数组。这个实现提供的唯一东西是十六进制输出而不是 Base64,值得一提的是答案的顶部。
  • 谢谢扎夫。是的,就我而言,我知道他们是。
  • 这是一个答案,因此“在我的情况下”不适用。不要使用NSASCIIStringEncoding,只需使用NSUTF8StringEncoding
  • stackoverflow.com/users/451475/zaph,就像目前的这种方法一样,即使将NSASCIIStringEncoding 替换为NSUTF8StringEncoding,它也会使用高位ASCII 字符返回错误的哈希值,例如:¥€£•‹›。正在修复。
【解决方案3】:

+ (NSString *)hmacSHA256EncryptString{


    NSString * parameterSecret = @"input secret key";
    NSString *plainString = @"input encrypt content string";
    const char *secretKey  = [parameterSecret cStringUsingEncoding:NSUTF8StringEncoding];
    const char *plainData = [plainString cStringUsingEncoding:NSUTF8StringEncoding];
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, secretKey, strlen(secretKey), plainData, strlen(plainData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    const unsigned char *bufferChar = (const unsigned char *)[HMACData bytes];
    NSMutableString *hmacString = [NSMutableString stringWithCapacity:HMACData.length * 2];
    for (int i = 0; i < HMACData.length; ++i){
        [hmacString appendFormat:@"%02x", bufferChar[i]];
    }
    return hmacString;
    
}

【讨论】:

    猜你喜欢
    • 2014-08-19
    • 2023-03-18
    • 2016-04-29
    • 2012-07-07
    • 2021-11-25
    • 1970-01-01
    • 2020-04-16
    • 2011-03-22
    • 2012-09-12
    相关资源
    最近更新 更多