在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类进行散列
- Xamarin Studio iOS程序集错误
- 如何在Azure中debuggingtesting发送?
- 在Monotouch中,是否可以将通用列表保存到NSUserDefaults?
- 继续在Apple的VerifyReceipt上得到21002'java.lang.NullPointerException'
- 当不是4字节alignment时,Monotouch浮点指针会抛出NullReferenceExceptionexception
- MonoGame – BlendState – 2D SpriteBatch
- 什么请求头用于上传图像文件从iOS到ASP.NET?
- ios文件共享/同步到Mac / PC设备
- 如何通过HTTP发送数据字节到.NET服务器