web-dev-qa-db-ja.com

xcode ios HMAC SHA 256ハッシュ

だから私は、iOSでhmacshad256ハッシュを実行する方法を理解しようとしています。これは、私が作成したwcfサービスapiに対して実行したハッシュです。私はそれについていくつかの情報を探していましたが、通常はSHA-256ハッシュを取得することになります。

これは私が持っている唯一のリファレンスです:

JavaのようにObjective CでHMAC SHA256ハッシュを生成する必要があります

そして、それがそれを行う唯一の方法であるかどうかはわかりません(Java hmacクラスをインポートする)

どんな助けでも大歓迎です。

ありがとう!

18
gdubs
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は非推奨です iOS 7.0から、最後の行は次のようになります。

NSString *base64Hash = [hash base64EncodedStringWithOptions:0];
33
Juraj Antas

これが私が提出している解決策であり、この問題に関する他の回答からまとめました。

これは、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;
}

これはiOS8.xおよびiOS7.xでテストされています

6
Alex Zavatone
+ (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;
    
}
2
KBVSMJ