适用于iPhone的Objective-C中的Sha256
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了适用于iPhone的Objective-C中的Sha256相关的知识,希望对你有一定的参考价值。
当我使用此代码创建字符串的sha256时
unsigned char hashedChars[32];
NSString *inputString;
inputString = [NSString stringWithFormat:@"hello"];
NSData * inputData = [inputString dataUsingEncoding:NSUTF8StringEncoding];
CC_SHA256(inputData.bytes, inputData.length, hashedChars);
它正确地返回哈希,但是我需要插入一个类似于 x00 x25 x53的字符串,在这种情况下,该函数返回一个空字符串的sha256,因为指定的编码不能用于转换接收器。
现在,我的问题是:如何插入此特殊字符以生成正确的哈希?谢谢
答案
试试这个,它对我有用
1)获取纯文本输入的哈希值
-(NSString*)sha256HashFor:(NSString*)input
{
const char* str = [input UTF8String];
unsigned char result[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(str, strlen(str), result);
NSMutableString *ret = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH*2];
for(int i = 0; i<CC_SHA256_DIGEST_LENGTH; i++)
{
[ret appendFormat:@"%02x",result[i]];
}
return ret;
}
2)获取NSData
的哈希作为输入
注意: - 我使用过NSData
类别,所以代码如下
- (NSString *)SHA256_HASH {
//if (!self) return nil;
unsigned char hash[CC_SHA256_DIGEST_LENGTH];
if ( CC_SHA256([(NSData*)self bytes], [(NSData*)self length], hash) ) {
NSData *sha2 = [NSData dataWithBytes:hash length:CC_SHA256_DIGEST_LENGTH];
// description converts to hex but puts <> around it and spaces every 4 bytes
NSString *hash = [sha2 description];
hash = [hash stringByReplacingOccurrencesOfString:@" " withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@"<" withString:@""];
hash = [hash stringByReplacingOccurrencesOfString:@">" withString:@""];
// hash is now a string with just the 40char hash value in it
//NSLog(@"hash = %@",hash);
// Format SHA256 fingerprint like
// 00:00:00:00:00:00:00:00:00
int keyLength=[hash length];
NSString *formattedKey = @"";
for (int i=0; i<keyLength; i+=2) {
NSString *substr=[hash substringWithRange:NSMakeRange(i, 2)];
if (i!=keyLength-2)
substr=[substr stringByAppendingString:@":"];
formattedKey = [formattedKey stringByAppendingString:substr];
}
return formattedKey;
}
return nil;
}
另一答案
知道您需要导入是很重要的:
#import <CommonCrypto/CommonDigest.h>
希望这有帮助!
另一答案
你可能应该使用NSData
而不是NSString
。你从哪里得到那个字符串?
另一答案
有人在Swift 3.0中寻找解决方案。这是
extension String {
// MARK: - SHA256
func get_sha256_String() -> String {
guard let data = self.data(using: .utf8) else {
print("Data not available")
return ""
}
return getHexString(fromData: digest(input: data as NSData))
}
private func digest(input : NSData) -> NSData {
let digestLength = Int(CC_SHA256_DIGEST_LENGTH)
var hashValue = [UInt8](repeating: 0, count: digestLength)
CC_SHA256(input.bytes, UInt32(input.length), &hashValue)
return NSData(bytes: hashValue, length: digestLength)
}
private func getHexString(fromData data: NSData) -> String {
var bytes = [UInt8](repeating: 0, count: data.length)
data.getBytes(&bytes, length: data.length)
var hexString = ""
for byte in bytes {
hexString += String(format:"%02x", UInt8(byte))
}
return hexString
}}
如何使用它
let signatures = "yourStringToBeConverted".get_sha256_String()
也不要忘记在你的Bridging-Header.h中导入#import <CommonCrypto/CommonHMAC.h>
以上是关于适用于iPhone的Objective-C中的Sha256的主要内容,如果未能解决你的问题,请参考以下文章
Xcode 5 ios 7 中的自动布局。如何创建适用于 iphone 4 和 iphone 5 的应用程序
是否有仅适用于 Objective-C 的 Clang 标志?