3

HMACアルゴリズムを使用してハッシュしたNSDataがあります。結果の文字列を印刷してどのように表示されるかを確認したかったのですが、常に画面に(null)印刷されています。2つの方法を試しましたが、うまくいきませんでした。誰かがハッシュされたデータ文字列を印刷する方法を提案できますか?この方法で作成されたハッシュを、JAVAであるサーバーで作成されたハッシュと比較したいと思いました。現在、JAVAは文字列オブジェクトを返します。それをObjectiveCによって作成されたNSDataとどのように比較しますか。

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

2 に答える 2

4

ここでの問題はHMACWithAlogorithm:、ダイジェストの文字列UTF8エンコーディングを構成するバイトではなく、ダイジェストを構成する生のバイトを返すことだと思います。これは、:が内部のライブラリからHMACWithAlgorithm使用しているという仮定に基づいています。CCHmacCommmonCrypto

以下はあなたが望むことをするかもしれないと思います、それは返された生のダイジェストを取り、それをダイジェストの16進エンコードされたNSStringに変換します:

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);
于 2012-04-11T05:28:33.983 に答える
0

2番目のアイデア(hmacStr1)は問題ありません。その文字列がnullの場合、入力データに疑問が投げかけられます。

これを行うとどうなるかを確認してください。

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]);

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

于 2012-04-11T04:45:42.753 に答える