1

基本上我想编写计算 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 Classes 参考中添加了 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=

谁能建议我做错了什么?

为什么这两个值不同?

请纠正我的错误。

4

2 回答 2

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# 中相同的散列。

于 2013-04-17T12:24:57.677 回答
1

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

所以我在这个链接上实现了方法:MD5 and SHA1 iOS implementation linked by this stackoverflow question

如果您发送 UTF8 编码字符串(unicode 1)并且如果您想要十六进制字符串或十进制字符串,我会通过集成将其作为参数发送

- (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

于 2013-06-14T07:44:23.980 回答