gpt4 book ai didi

iphone - iOS/Objective-C : SHA-1 and Base64

转载 作者:行者123 更新时间:2023-12-03 20:22:12 30 4
gpt4 key购买 nike

我必须将短语“1234”转换为其 SHA-1 哈希值的 Base64 编码。

我想要:'1234' = cRDtpNCeBiql5KOQsKVyrA0sAiA=(此示例与服务器通信相关)...

但是当我在这些网站上手动检查它或在我的 XCode 项目中使用我的方法时,结果总是不同的:

1234

SHA-1 之后 ( http://www.sha1.cz/ )7110eda4d09e062aa5e4a390b0a572ac0d2c0220

Base64 之后 ( http://base64-encoder-online.waraxe.us/ )NzExMGVkYTRkMDllMDYyYWE1ZTRhMzkwYjBhNTcyYWMwZDJjMDIyMA==

这是我的 SHA-1 函数:

- (NSString *)sha1:(NSString *)str {
const char *cStr = [str UTF8String];
unsigned char result[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(cStr, strlen(cStr), result);
NSString *s = [NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3], result[4],
result[5], result[6], result[7],
result[8], result[9], result[10], result[11], result[12],
result[13], result[14], result[15],
result[16], result[17], result[18], result[19]
];

return [s lowercaseString];
}

对于 Base64,我使用此类:http://cocoawithlove.com/2009/06/base64-encoding-options-on-mac-and.html

这是 SHA-1 和 Base64 的调用:

 NSString *pwHash =[self sha1:self._txtFieldPW.text]; //In my case '1234'
NSLog(@"Hash: %@",pwHash); //7110eda4d09e062aa5e4a390b0a572ac0d2c0220
//7110eda4d09e062aa5e4a390b0a572ac0d2c0220
NSData *pwHashData = [[NSData alloc]initWithData:[pwHash dataUsingEncoding:1]];
NSString *base64 = [pwHashData base64Encoding];
NSLog(@"Base64: %@",base64);
//NzExMGVkYTRkMDllMDYyYWE1ZTRhMzkwYjBhNTcyYWMwZDJjMDIyMA==

出了什么问题?

最佳答案

哈希值是一个二进制值。 “cRDtpNCeBiql5KOQsKVyrA0sAiA=”字符串是哈希编码的二进制值的结果。同时,“NzExMGVkYTRkMDllMDYyYWE1ZTRhMzkwYjBhNTcyYWMwZDJjMDIyMA==”字符串是对十六进制哈希值进行Base64转换的结果。

这有道理吗?所以你有一个 SHA1 哈希值,一个 20 字节的数组:{0x71, 0x10, ...}。您可以按原样对该内存块进行 Base64 编码。或者您可以将每个字节转换为两个小写十六进制数字,然后您将得到 ASCII 字符串“7110eda4d09e062aa5e4a390b0a572ac0d2c0220”。如果您将 Base64 编码应用于该字符串,而不是原始哈希字节,您将获得 Base64 值“NzExMGV...”。

编辑,具有额外的二进制优点:重新编写第二个片段:

unsigned char result[CC_SHA1_DIGEST_LENGTH]; 
const char *cStr = [self._txtFieldPW.text UTF8String];
CC_SHA1(cStr, strlen(cStr), result); //Now result contains the hash

//Wrap the result in a NSData object
NSData *pwHashData = [[NSData alloc] initWithBytes:result length: sizeof result];
//And take Base64 of that
NSString *base64 = [pwHashData base64Encoding];
NSLog(@"Base64: %@",base64);

并摆脱sha1方法。一旦删除了可怕的 stringWithFormat 调用,它就变成了两行代码。如果您确实想要日志中的十六进制哈希值,请成为我的客人;但不要将十六进制字符串视为哈希的真实值,因为它不是。

除非您使用 ARC,否则不要忘记随后释放 NSData 对象。

关于iphone - iOS/Objective-C : SHA-1 and Base64,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7310457/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com