- 参考文章:https://baike.baidu.com/item/SHA家族/9849595?fromtitle=SHA&fromid=9533316&fr=aladdin
- 参考文章:https://www.jianshu.com/p/7500ee76e8ae
目录
简介
HASH算法是密码学的基础,比较常用的有MD5和SHA,最重要的两条性质,就是不可逆和无冲突。
上篇介绍了MD5,本篇介绍SHA。
什么是SHA
安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族,是FIPS所认证的安全散列算法。能计算出一个数字消息所对应到的,长度固定的字符串(又称消息摘要)的算法。且若输入的消息不同,它们对应到不同字符串的机率很高。
- 版本:
SHA-0
SHA-1
SHA-2:包括以下变种 SHA-256,SHA-384和SHA-512 后来又发布了 SHA-224
- 安全性
SHA-0 目前不再建议使用:2005年二月,王小云和殷益群、于红波再度发表了对SHA-0破密的算法,可在2的计算复杂度内就找到碰撞。
SHA-1 目前不再建议使用:2005年8月17日的CRYPTO会议尾声中王小云、姚期智、姚储枫再度发表更有效率的SHA-1攻击法,能在2个计算复杂度内找到碰撞。SHA-1 产生的字符长度为40如: 86f7e437faa5a7fce15d1ddcb9eaeaea377667b8
SHA-256 目前使用最多,会产生一个64个字符长度的字符串。如: ca978112ca1bbdcafac231b39a23dc4da786eff8147c4e72b9807785afee48bb
应用场景
关于SHA散列算法的应用场景与MD5类似,可参考上篇关于MD5的应用场景介绍
OC代码实现
SHA-1 代码实现
//首先需要导入头文件
#import<CommonCrypto/CommonDigest.h>
/**
获取字符串的SHA1值
@param string 字符串
@return 加密后SHA1值
*/
+(NSString *)SHA1:(NSString *)string{
//字符串转data 包含中文时此种方法会出现问题
//const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding];
//NSData *data = [NSData dataWithBytes:cstr length:input.length];
//字符串转Data
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsigned int)data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(int i=0; i<CC_SHA1_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
/**
获取文件的SHA1值
@param filePath 文件路径
@return 加密后SHA1值
*/
+ (NSString *)getFileSHA1:(NSString *)filePath{
if([[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:nil]){
//文件内容转Data
NSData *data = [NSData dataWithContentsOfFile:filePath];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes,(CC_LONG)data.length,digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for( int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++ ){
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
return nil;
}
/**
获取NSData的SHA1值
@param data 字节流
@return 加密后SHA1值
*/
+ (NSString *)getDataSHA1:(NSData *)data{
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes,(CC_LONG)data.length,digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for( int i = 0; i < CC_SHA1_DIGEST_LENGTH; i++ ){
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
SHA256 代码实现
//首先需要导入头文件
#import<CommonCrypto/CommonDigest.h>
/**
获取字符串的SHA256值
@param string 字符串
@return 加密后SHA256值
*/
+(NSString *)SHA256:(NSString *)string{
//字符串转data 包含中文时此种方法会出现问题
//const char *cstr = [string cStringUsingEncoding:NSUTF8StringEncoding];
//NSData *data = [NSData dataWithBytes:cstr length:input.length];
//字符串转Data
NSData * data = [string dataUsingEncoding:NSUTF8StringEncoding];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes, (unsigned int)data.length, digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for(int i=0; i<CC_SHA256_DIGEST_LENGTH; i++) {
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
/**
获取文件的SHA256值
@param filePath 文件路径
@return 加密后SHA256值
*/
+ (NSString *)getFileSHA256:(NSString *)filePath{
if([[NSFileManager defaultManager] fileExistsAtPath:filePath isDirectory:nil]){
//文件内容转Data
NSData *data = [NSData dataWithContentsOfFile:filePath];
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes,(CC_LONG)data.length,digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for( int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++ ){
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
return nil;
}
/**
获取NSData的SHA256值
@param data 字节流
@return 加密后SHA256值
*/
+ (NSString *)getDataSHA256:(NSData *)data{
uint8_t digest[CC_SHA256_DIGEST_LENGTH];
CC_SHA256(data.bytes,(CC_LONG)data.length,digest);
NSMutableString *output = [NSMutableString stringWithCapacity:CC_SHA256_DIGEST_LENGTH * 2];
for( int i = 0; i < CC_SHA256_DIGEST_LENGTH; i++ ){
[output appendFormat:@"%02x", digest[i]];
}
return output;
}
行者常至,为者常成!