在Objective-C和C#.NET中产生不同结果的SHA1哈希

基本上我想编写计算sha1哈希函数。

到目前为止我已经尝试了如下。

C#.NET

byte[] p2 = System.Text.Encoding.Unicode.GetBytes("password"); System.Security.Cryptography.SHA1 sha = new System.Security.Cryptography.SHA1CryptoServiceProvider(); byte[] result = sha.ComputeHash(p2); string encodedPassword = Convert.ToBase64String(result); 

输出: 6Pl / upEE0epQR5SObftn + s2fW3M =

Objective-C的

我从NSData_Base64类引用添加了Base64的类 。

 NSString *password = @"password"; NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding]; NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding]; data = [unicodePassword dataUsingEncoding:NSUnicodeStringEncoding]; unsigned char hash[CC_SHA1_DIGEST_LENGTH]; CC_SHA1([data bytes], [data length], hash); NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH]; NSLog(@"Result: %@",[result base64EncodedString]); 

输出: dYusXVhObIBzJMgg1E1FJ9cK1NY =

任何人都可以请build议我做错了什么?

为什么这两个值有所不同?

请纠正我的错误。

这一行是错误的,因为您将UTF8编码数据解释为Unicode编码:

NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];

用第二行代码: NSData *data = [password dataUsingEncoding:NSUnicodeStringEncoding];

数据中的前两个字节是BOM(字节顺序标记)。

data = [NSData dataWithBytes:[data bytes] + 2 length:[data length] - 2];移除这2个字节data = [NSData dataWithBytes:[data bytes] + 2 length:[data length] - 2];

…然后散列这些数据,你将有相同的散列在C#中。

有关更多信息,我发现SHA1函数可以有一些结果..

所以我已经在这个链接上实现了方法:通过这个stackoverflow问题链接的MD5和SHA1 iOS实现

如果您发送UTF8编码string(unicode之一),并且如果您想要hexstring或十进制数字

 - (NSString*) sha1UTF8Encoding:(BOOL)utf8 andDecimal:(BOOL)decimal { const char *cstr; if (utf8) { cstr = [self cStringUsingEncoding:NSUTF8StringEncoding]; }else{ cstr = [self cStringUsingEncoding:NSUnicodeStringEncoding]; } NSData *data = [NSData dataWithBytes:cstr length:self.length]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes, data.length, digest); NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2]; for(int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++){ if (decimal) { [output appendFormat:@"%i", digest[i]]; }else{ [output appendFormat:@"%02x", digest[i]]; } } return output; } 

(请注意,我在NSString类中实现了这个方法)

有了这个,我testing了一下,你可以将它用于许多目的sha1操作,例如这个configuration:

 NSString* sha1 = [stringToTest sha1UTF8Encoding:YES andDecimal:YES]; 

sha1variables通过在此链接中find的C#方法与一个产品匹配: 使用SHA1类进行散列