如何在 iOS 中计算 SHA-2(最好是 SHA 256 或 SHA 512)哈希?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/6228092/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
How can I compute a SHA-2 (ideally SHA 256 or SHA 512) hash in iOS?
提问by James
The Security services API doesn't appear to allow me to compute a hash directly. There are plenty of public domain and liberally licensed versions available, but I'd rather use a system library implementation if possible.
安全服务 API 似乎不允许我直接计算散列。有很多公共领域和自由许可的版本可用,但如果可能的话,我宁愿使用系统库实现。
The data is accessible via NSData, or plain pointers.
数据可通过 NSData 或普通指针访问。
The cryptographic strength of the hash is important to me. SHA-256 is the minimum acceptable hash size.
散列的加密强度对我很重要。SHA-256 是可接受的最小哈希大小。
回答by alex-i
This is what I'm using for SHA1:
这是我用于 SHA1 的内容:
#import <CommonCrypto/CommonDigest.h>
+ (NSData *)sha1:(NSData *)data {
unsigned char hash[CC_SHA1_DIGEST_LENGTH];
if ( CC_SHA1([data bytes], [data length], hash) ) {
NSData *sha1 = [NSData dataWithBytes:hash length:CC_SHA1_DIGEST_LENGTH];
return sha1;
}
return nil;
}
Replace CC_SHA1
with CC_SHA256
(or whichever you need), as well as CC_SHA1_DIGEST_LENGTH
with CC_SHA256_DIGEST_LENGTH
.
更换CC_SHA1
用CC_SHA256
(或任何你需要的),以及CC_SHA1_DIGEST_LENGTH
用CC_SHA256_DIGEST_LENGTH
。
回答by Ege Akpinar
Here's a pretty similar one based on NSString
这是一个基于 NSString 的非常相似的
+ (NSString *)hashed_string:(NSString *)input
{
const char *cstr = [input cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:input.length];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
// This is an iOS5-specific method.
// It takes in the data, how much data, and then output format, which in this case is an int array.
CC_SHA256(data.bytes, data.length, digest);
NSMutableString* output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
// Parse through the CC_SHA256 results (stored inside of digest[]).
for(int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
(Credits go to http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1)
(学分转到http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1)
回答by mdkr
This is what worked for me
这对我有用
func sha256(securityString : String) -> String {
let data = securityString.dataUsingEncoding(NSUTF8StringEncoding)!
var hash = [UInt8](count: Int(CC_SHA256_DIGEST_LENGTH), repeatedValue: 0)
CC_SHA256(data.bytes, CC_LONG(data.length), &hash)
let output = NSMutableString(capacity: Int(CC_SHA1_DIGEST_LENGTH))
for byte in hash {
output.appendFormat("%02x", byte)
}
return output as String
}
回答by Sunil aruru
Below link i used for creating document hash value and Its very simple and easy to calculate hash value specially for large files.
下面的链接我用于创建文档散列值,它非常简单易行,专门为大文件计算散列值。
链接:http: //www.joel.lopes-da-silva.com/2010/09/07/compute-md5-or-sha-hash-of-large-file-efficiently-on-ios-and-mac- os-x/comment-page-1/#comment-18533
回答by Boris
+ (NSData *)sha256DataFromData:(NSData *)data {
unsigned char result[CC_SHA256_DIGEST_LENGTH];
CC_SHA256([data bytes], (int)[data length], result);
return [NSData dataWithBytes:result length:CC_SHA256_DIGEST_LENGTH];
}
回答by dcow
I cleaned up https://stackoverflow.com/a/13199111/1254812a bit and structured it as an NSString
extension
我清理了https://stackoverflow.com/a/13199111/1254812并将其构建为NSString
扩展
@interface NSString (SHA2HEX)
/*
Get the SHA2 (256 bit) digest as a hex string.
*/
@property (nonatomic, readonly) NSString* sha2hex;
@end
@implementation NSString (SHA2HEX)
- (NSString*)sha2hex
{
NSData *data = [self dataUsingEncoding:NSUTF8StringEncoding];
if (data.length > UINT32_MAX)
return nil;
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (CC_LONG)data.length, digest);
const int hexlen = CC_SHA256_DIGEST_LENGTH * 2;
NSMutableString *hexstr = [NSMutableString stringWithCapacity:hexlen];
for (int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++) {
[hexstr appendFormat:@"%02x", digest[i]];
}
return hexstr;
}
@end