Ios 将某些哈希代码从.net语法转换为objective-c
我正在尝试将一些用Ios 将某些哈希代码从.net语法转换为objective-c,ios,iphone,.net,objective-c,sha1,Ios,Iphone,.net,Objective C,Sha1,我正在尝试将一些用.NET编写的hashcode翻译成Objective-c语法 SHA1 sha1 = new SHA1CryptoServiceProvider(); string hashedword = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(saltkey))) 这就是我目前所拥有的 NSData *data = [password dataUsingEncoding:NSUTF8Strin
.NET
编写的hashcode翻译成Objective-c
语法
SHA1 sha1 = new SHA1CryptoServiceProvider();
string hashedword = Convert.ToBase64String(sha1.ComputeHash(Encoding.ASCII.GetBytes(saltkey)))
这就是我目前所拥有的
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];
最后我想要一个散列的NSString
有人能帮我吗?如果您需要最终的base-64字符串,您可以使用此代码,它可以调用新的iOS 7
base64EncodedStringWithOptions
,也可以调用早期版本中现在已弃用(以前是私有的)base64encodeing
方法:
NSString *string;
if ([data respondsToSelector:@selector(base64EncodedStringWithOptions:)]) {
string = [result base64EncodedStringWithOptions:kNilOptions]; // iOS 7+
} else {
string = [result base64Encoding]; // pre iOS7
}
nsuincodesingecoding
转换在您的代码中看起来很可疑,似乎
没有必要。您必须使用与.NET代码相同的编码
我不能用.NET测试这个,但是
根据,Encoding.ASCII
使用
所有非ASCII字符的替换字符?
没有等效的NSStringEncoding
,但结果相同
可通过CoreFoundation方法实现:
NSString *password = ... // your password
CFIndex asciiLength;
// Determine length of converted data:
CFStringGetBytes((__bridge CFStringRef)(password), CFRangeMake(0, [password length]),
kCFStringEncodingASCII, '?', false, NULL, 0, &asciiLength);
// Allocate buffer:
uint8_t *asciiBuffer = malloc(asciiLength);
// Do the conversion:
CFStringGetBytes((__bridge CFStringRef)(password), CFRangeMake(0, [password length]),
kCFStringEncodingASCII, '?', false, asciiBuffer, asciiLength, NULL);
现在可以计算SHA1散列:
unsigned char hash[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(asciiBuffer, asciiLength, hash);
free(asciiBuffer);
NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
最后是哈希中的Base64编码字符串。从iOS 7开始,
有一种内置方法:
NSString *base64 = [result base64EncodedStringWithOptions:0];
更好的选择是使用UTF-8编码而不是ASCII编码
(适用于.NET和Objective-C)。
在这种情况下,代码将简化为
NSData *data = [password dataUsingEncoding:NSUTF8StringEncoding];
unsigned char hash[CC_SHA1_DIGEST_LENGTH];
CC_SHA1([data bytes], [data length], hash);
NSData *result = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
NSString *base64 = [result base64EncodedStringWithOptions:0];
如果密码只包含ASCII字符,则两种方法都给出相同的结果。
除此之外,您建议更改为UTD8编码是值得考虑的事情。