基本上我想编写计算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 =
目标C
我已经从NSData_Base64 Classes reference添加了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 =
任何人都可以建议我做错了什么?
为什么这两个值不同?
请纠正我的错误。
答案 0 :(得分:3)
这一行是错误的,因为您将UTF8编码数据解释为Unicode编码:
NSString *unicodePassword = [[NSString alloc] initWithData:data encoding:NSUnicodeStringEncoding];
使用以下命令重新显示第二行:
NSData *data = [password dataUsingEncoding:NSUnicodeStringEncoding];
数据中的2个第一个字节是BOM(字节顺序标记)。
删除这2个字节
data = [NSData dataWithBytes:[data bytes] + 2 length:[data length] - 2];
...然后散列那些数据,你将拥有与C#中相同的散列。
答案 1 :(得分:1)
有关详细信息,我发现SHA1功能可以有一些结果..
所以我在此链接上实施了方法:MD5 and SHA1 iOS implementation
链接的this stackoverflow question如果您发送UTF8编码字符串(unicode one)并且如果您想要十六进制字符串或十进制字符串
,我将使用我的集成作为参数进行优化- (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类别中实现了此方法)
有了这个,我测试过你可以将它用于多种用途的sha1操作,例如使用这种配置:
NSString* sha1 = [stringToTest sha1UTF8Encoding:YES andDecimal:YES];
sha1变量与此产品的C#方法匹配:Hashing using the SHA1 class