JHHK

欢迎来到我的个人网站
行者常至 为者常成

SHA

目录

简介

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;
}

行者常至,为者常成!





R
Valine - A simple comment system based on Leancloud.