2012-04-11 4 views
3

HMACアルゴリズムを使用してハッシュしたNSDataがあります。私は結果の文字列&を印刷したかったのですが、見た目は変わっていましたが、常に画面に印刷されていました。私は2つの方法を試しましたが、うまくいかなかったのです。誰かがハッシュされたデータ文字列を印刷する方法を提案できますか?このようにして作成されたハッシュと、JAVAであるサーバー上に作成されたハッシュを比較したいと思いました。さて、JAVAは文字列オブジェクトを返します。どのようにそれは目的Cによって作成されたNSDataと比較されます。NSDataからNSStringを印刷し、HMACハッシュを比較する

NSData *hmac = [aData HMACWithAlgorithm:kCCHmacAlgSHA1]; 
NSString *hmacStr = [NSString stringWithUTF8String:[hmac bytes]]; 
NSString *hmacStr1 = [[NSString alloc] initWithData:hmac 
               encoding:NSUTF8StringEncoding]; 
NSLog(@"Hashed Data=%@ data2=%@",hmacStr,hmacStr1); 

答えて

4

ここでの問題は、HMACWithAlogorithm:が、ダイジェストの文字列UTF8エンコードを構成するバイトではなく、ダイジェストを構成する生のバイトを返すことです。これは、HMACWithAlgorithmCommmonCryptoライブラリのCCHmacを使用しているという前提に基づいています。

私は次はあなたがやりたいかもしれません、それは生のダイジェストが返さ取り、ダイジェストのNSStringの16進符号化に変換すると思います:

NSData *hmac = [aData HMACWithAlgorithm:kCCHmacAlgSHA1]; 

// Get a pointer to the raw bytes of the digest 
unsigned char *digest = (unsigned char *)[hmac bytes]; 

// Convert the bytes to their hex representation 
NSString *hmacStr = [NSString stringWithFormat:@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X", 
       digest[0], digest[1], digest[2], digest[3], digest[4], digest[5], digest[6], digest[7], 
       digest[8], digest[9], digest[10], digest[11], digest[12], digest[13], digest[14], digest[15], 
       digest[16], digest[17], digest[18], digest[19]];  


NSLog(@"Hashed Data=%@",hmacStr); 
0

2番目のアイデア(hmacStr1)は問題ありません。その文字列がヌルの場合、入力データに疑問があります。

あなたがこれを行うときに何が起こるかを参照してください:右

NSLog(@"about to hash %@, which is %d bytes long", aData, [aData length]); 
NSData *hmac = [aData HMACWithAlgorithm:kCCHmacAlgSHA1]; 
NSLog(@"the hash result is %@, which is %d bytes long", hmac, [hmac length]); 

ヌルデータを、?修正は文字列に変換する前に行う必要があります。

+0

これが第二の印刷文の結果です - >ハッシュ結果はです。これは20バイト長の – Abhinav

+0

です。その後、hmacStr1を記録するとヌルですか?ごめんなさい。私は困惑している。ちょうど考え:あなたはサーバーからJavaのハッシュを取得していますか?それはHTTPの結果本体であるときにもNSDataになります。 NSDataはcompareを実装していますが、とにかく文字列が機能しないことに驚いています – danh

関連する問題