2011-07-18 9 views
1

Rubyコード:iPhone SHA-1はRailsと異なる結果をエンコードしていますか?

a = OpenSSL::HMAC.digest('sha1', 'secret', 'example') 

、その後:

Base64.encode64(a).chomp 

利回り

aMp6Zw1+hHVMmwWXoFp/Aaipc20= 

iPhone:

+ (NSData *)hmac:(NSString *)input withKey:(NSString *)key { 
    const char *cstrInput = [input cStringUsingEncoding:NSASCIIStringEncoding]; 
    const char *cstrKey = [key cStringUsingEncoding:NSASCIIStringEncoding]; 
    NSData *data = [NSData dataWithBytes:cstrInput length:input.length]; 

    unsigned char chmac[CC_SHA1_DIGEST_LENGTH]; 
    CCHmac(kCCHmacAlgSHA1, cstrKey, strlen(cstrKey), data, [data length], &chmac); 

    NSData *hmacData = [[NSData alloc] initWithBytes:chmac length:sizeof(chmac)]; 
    return [hmacData autorelease]; 
} 

[XICrypto hmac:@"example" withKey:@"secret"]; 
NSLog(@"HMACData: %@",[HMACData description]); 
NSString *HMACEncodedString = [HMACData base64Encoding]; 

(base64Encoding方法がCocoa Base 64 Implementation for REST Auth上のアレックス・レイノルズ答えからである。)

結果は、したがって、これらの方法は、なぜ、同じ操作を実行していない

Qm+ManmzmtfhpOzFdf8UHW43L5o= 

をもたらしますか?

EDIT:Railsコールでdigestとkeyが後方にありました。 iPhoneのコールとはまだ結果が異なるという問題を修正しました。

+0

ここを見ていますか? SHA-1暗号化を実行するための正しい機能を使用しているかどうかはわかりません。http://stackoverflow.com/questions/3468268/objective-c-sha1 – Perception

+1

CCHmacは、init updateとfinalの1関数呼び出しであると考えられています。私はこの問題を調べており、文字列エンコーディングが最大の違いを作り出しています。 – Joe

+0

@受付、その投稿の秘密鍵のオプションは表示されません。 @Joe、エンコーディングに問題はありますか? – quantumpotato

答えて

3

はい私は自分自身でその部分を理解した後、私はあなたのコメントを参照してください:)あなたのレール呼び出しは後方にあり、あなたの次の問題はエンコードです。文字列エンコーディングを使用するときに正しい長さのバイトが必要な場合は、lengthOfBytesUsingEncoding:を使用してください。

+ (NSData *)hmac:(NSString *)input withKey:(NSString *)key { 
    NSStringEncoding encoding = NSASCIIStringEncoding; 
    const char *cstrInput = [input cStringUsingEncoding:encoding]; 
    NSUInteger inputLength = [input lengthOfBytesUsingEncoding:encoding]; 
    const char *cstrKey = [key cStringUsingEncoding:encoding]; 
    NSUInteger keyLength = [key lengthOfBytesUsingEncoding:encoding]; 

    unsigned char chmac[CC_SHA1_DIGEST_LENGTH]; 
    CCHmac(kCCHmacAlgSHA1, cstrKey, keyLength, cstrInput, inputLength, &chmac); 

    return [[[NSData alloc] initWithBytes:chmac length:sizeof(chmac)] autorelease]; 
} 

は、私がデータの内容をログに記録し、 68ca7a67 0d7e8475 4c9b0597 a05a7f01 a8a9736dを取得し、あなたが this translatorの六角フィールドに貼り付けること場合は、base64フィールドに aMp6Zw1+hHVMmwWXoFp/Aaipc20=を取得します。

+0

あなたのorignalメソッドは、input.lengthの代わりにデータを作成するときにstrlen(cstrInput)を使って修正することもできます。 – Joe

+0

ああ!ありがとうジョー – quantumpotato

+0

ちょうど感謝したいと思います。私の日を救った! –

関連する問題