2016-09-15 14 views
1

に私は、次のデータでArcaneライブラリを使用してのiOSでSHA256を生成しようとしました:生成SHA256は、iOS

文字列:Amount=50&BillerID=59&ChannelID=2&Context=34|check|test&ReturnURL=https://uat.myfatoora.com/ReceiptPOC.aspx&TxnRefNum=000000000020003&UserName=DCS

キー:71DD0F73AFFBB47825FF9864DDE95F3B結果は私が

409dc622b3bef5c9fc46e45c3210111fcb4536d3a55833316fe0dc8154b3ea34考えられていた

正しい。

Windows Phone Source Code: 

public static string HmacSha256(string secretKey, string value) 
    { 
     var msg = CryptographicBuffer.ConvertStringToBinary(value, BinaryStringEncoding.Utf8); 
     byte[] convertedHash = new byte[secretKey.Length/2]; 

     for (int i = 0; i < secretKey.Length/2; i++) 
     { 
      convertedHash[i] = (byte)Int32.Parse(secretKey.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber); 
     } 

     // Create HMAC. 
     var objMacProv = MacAlgorithmProvider.OpenAlgorithm(MacAlgorithmNames.HmacSha256); 
     CryptographicHash hash = objMacProv.CreateHash(convertedHash.AsBuffer()); 

     hash.Append(msg); 
     return CryptographicBuffer.EncodeToHexString(hash.GetValueAndReset()); 

    } 

を、結果は次のとおりです:ただし、Windowsの対応は、次のコードを使用してSHA256を生成している私が得たものと異なっている94a20ca39c8487c7763823ec9c918d9e38ae83cb741439f6d129bcdef9edba73。誰かがこれを手伝って、上記のコードが何をしているのか、iOSでそれをどのように複製できるのか教えてください。

編集:

iOS Source code 

let key = self.md5(string: "71DD0F73AFFBB47825FF9864DDE95F3B") 

    let hash = HMAC.SHA256(str, key: key) 
+1

あなたはiOSの側についてのコードを示しませんでした。また、SHA256とHMAC-SHA256は別のものです。 –

+0

@SamKuhmonen:iOSのソースを追加しました。 Arcaneライブラリを使用しています。 –

答えて

2

ここで重要なのは、16進文字列であるシークレットをNSDataに変換する必要があることです。つまり、NSDataバイトストリームは秘密のように「見える」でしょう。

これは、あなたが欲しいものを行う必要があります。

// Hex string to NSData conversion from here http://stackoverflow.com/questions/7317860/converting-hex-nsstring-to-nsdata 
    NSString *secret = @"71DD0F73AFFBB47825FF9864DDE95F3B"; 
    NSData *dataIn = [@"Amount=50&BillerID=59&ChannelID=2&Context=34|check|test&ReturnURL=https://uat.myfatoora.com/ReceiptPOC.aspx&TxnRefNum=000000000020003&UserName=DCS" dataUsingEncoding:NSUTF8StringEncoding]; 
    NSMutableData *macOut = [NSMutableData dataWithLength:CC_SHA256_DIGEST_LENGTH]; 

    secret = [secret stringByReplacingOccurrencesOfString:@" " withString:@""]; 
    NSMutableData *secretData = [[NSMutableData alloc] init]; 
    unsigned char whole_byte; 
    char byte_chars[3] = {'\0','\0','\0'}; 
    int i; 
    for (i=0; i < [secret length]/2; i++) { 
     byte_chars[0] = [secret characterAtIndex:i*2]; 
     byte_chars[1] = [secret characterAtIndex:i*2+1]; 
     whole_byte = strtol(byte_chars, NULL, 16); 
     [secretData appendBytes:&whole_byte length:1]; 
    } 

    CCHmac(kCCHmacAlgSHA256, secretData.bytes, secretData.length, dataIn.bytes, dataIn.length, macOut.mutableBytes); 

    NSMutableString *stringOut = [NSMutableString stringWithCapacity:macOut.length]; 
    const unsigned char *macOutBytes = macOut.bytes; 

    for (NSInteger i=0; i<macOut.length; ++i) { 
     [stringOut appendFormat:@"%02x", macOutBytes[i]]; 
    } 

    NSLog(@"dataIn: %@", dataIn); 
    NSLog(@"macOut: %@", macOut); 
    NSLog(@"stringOut: %@", stringOut); 

出力:

2016年9月27日20:18:54.181 JKS [27562:5321334]ストリームdataIn:< 416d6f75 6e743d35 30264269 6c6c6572 49443d35 39264368 616e6e65 6c49443d 3226436f 6e746578 743d3334 7c636865 636b7c74 65737426 52657475 726e5552 4c3d6874 7470733a 2f2f7561 742e6d79 6661746f 6f72612e 636f6d2f 52656365 69707450 73707826 4f432e61 54786e52 65664e75 6d3d3030 30303030 30303030 32303030 33265573 65724e61 6d653d44 4353>

2016年9月27日20:18:54.181 JKS [27562:5321334] macOut:< 94a20ca3 9c8487c7 763823ec 9c918d9e 38ae83cb 741439f6 d129bcde f9edba73>

2016年9月27日午前20時18分54秒。181のJKS [27562:5321334] STRINGOUT:94a20ca39c8487c7763823ec9c918d9e38ae83cb741439f6d129bcdef9edba73

(コードをクリーンアップする必要があります)あなたはData

に16進数文字列を変換するために、この拡張機能を使用することができます

// http://stackoverflow.com/questions/29799361/generate-a-hmac-swift-sdk8-3-using-cchmac 
func generateHMAC(key: String, data: String) -> String { 
    let keyData = key.dataFromHexadecimalString()! as NSData 
    let dataIn = data.data(using: .utf8)! as NSData 
    var result: [CUnsignedChar] 
    result = Array(repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH)) 
    CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), keyData.bytes, keyData.length, dataIn.bytes, dataIn.length, &result) 

    let hash = NSMutableString() 
    for val in result { 
     hash.appendFormat("%02hhx", val) 
    } 

    return hash as String 
} 

スウィフトに更新しました

let secret = "71DD0F73AFFBB47825FF9864DDE95F3B" 
    let value = "Amount=50&BillerID=59&ChannelID=2&Context=34|check|test&ReturnURL=https://uat.myfatoora.com/ReceiptPOC.aspx&TxnRefNum=000000000020003&UserName=DCS" 

    print("\(generateHMAC(key: secret, data: value))") 

あなたの出力は、あなたがあなたの橋渡しヘッダーで#import <CommonCrypto/CommonCrypto.h>が必要になります94a20ca39c8487c7763823ec9c918d9e38ae83cb741439f6d129bcdef9edba73

でなければなりません。

+0

ああ、あなたは#import

+0

が必要です。申し訳ありません、Obj-Cですが、Swiftでも同じことができるはずです。ここでは、その上でいくつかの参照へのリンクですhttp://stackoverflow.com/questions/29799361/generate-a-hmac-swift-sdk8-3-using-cchmac –

+0

こんにちは、答えのおかげで。あなたは 'let dataIn = data.data(.utf8を使って)のdata.dataを教えてください。それは私にエラーを与えているのでNSData'として。 StringをNSDataに変換していると仮定します。 –

1

Windowsのコードは、文字列を受け取り進数としてそれを解釈し、1バイトに2つの文字の時間に変換します。

あなたのMacコードの中で最も好きなものはのようにです。キーは「71」から始まるため、Windowsコードでは、値0x71 = 129の1バイトとしてMacコードで「7」= 55、「1」= 49の2バイトとなります。

Windows上で行うのと同じように、Mac上のバイトを正確に変換するだけで済みます。考えられないことを実行して、実際のハッシュ計算がどのように行われるかを確認するには、Macライブラリのソースコードを参照する必要があります。

+0

range.location <32 { convertedHash.appendData(秘密鍵ならば、私は (2、私は2 *)0 ... secretKey.length/2 { LET範囲= NSMakeRangeで私のためにこの 'のような何かをしようとしました.substringWithRange(range).dataUsingEncoding(NSUTF8StringEncoding)!) } } ' しかし、それは助けにはなりませんでした。いくつかのコードを投稿してください。 –

0

#import <CommonCrypto/CommonHMAC.h> 
 

 
+ (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; 
 
    
 
}

関連する問題