加密(MD5加密和HAMC加密)

来源:互联网 发布:linux内核的系统 编辑:程序博客网 时间:2024/05/20 07:20

MD5加密

一:首先自己创建一个分类



二:在.h文件里写一个加密方法的声名

- (NSString *)stringToMD5:(NSString *)str;



三:.m文件里


1.先将加密的库导进来

#import <CommonCrypto/CommonCrypto.h>

2.对加密方法进行实现

- (NSString *)stringToMD5:(NSString *)str

{

    constchar *fooData = [strUTF8String];

    

    //2.然后创建一个字符串数组,接收MD5的值

    unsignedchar result[CC_MD5_DIGEST_LENGTH];

    

    //3.计算MD5的值,这是官方封装好的加密方法:把我们输入的字符串转换成16进制的32位数,然后存储到result

    CC_MD5(fooData, (CC_LONG)strlen(fooData), result);

    /**

     第一个参数:要加密的字符串

     第二个参数:获取要加密字符串的长度

     第三个参数:接收结果的数组

     */

    

    //4.创建一个字符串保存加密结果

    NSMutableString *saveResult = [NSMutableStringstring];

    

    //5.result数组中获取加密结果并放到 saveResult

    for (int i =0; i <CC_MD5_DIGEST_LENGTH; i++) {

        [saveResult appendFormat:@"%02x", result[i]];

    }

    /*

     x表示十六进制,%02X 意思是不足两位将用0补齐,如果多余两位则不影响

     NSLog("%02X", 0x888);  //888

     NSLog("%02X", 0x4); //04

     */

    return saveResult;

}


四:控制器里调用


五:输出结果

六:这样子直接MD5加密会被破解出来

因为MD加密后的值是一个32位的唯一值,比如说123456加密后的值是auysvdajbdajbd1231,这是是唯一的,不管加密多少次,结果都是auysvdajbdajbd1231

解决方法:

使用MD5加盐方法,即定义一个静态的字符串static值,在MD5加密之前先将static值拼接在密码后面再进行加密,这样就安全系数提高


HAMC加密

和MD5一样是创建一个分类,在.h里面声名,.m里面实现

#pragma mark - HMAC 散列函数

- (NSString *)hmacMD5StringWithKey:(NSString *)key {

    constchar *keyData = key.UTF8String;

    constchar *strData =self.UTF8String;

    uint8_t buffer[CC_MD5_DIGEST_LENGTH];

    

    CCHmac(kCCHmacAlgMD5, keyData, strlen(keyData), strData, strlen(strData), buffer);

    

    return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];

}

HAMC加密思路:

1、注册账号时向服务器申请一个随机生成唯一的key值,将key值保存的手机本地(利用钥匙串)和服务器

2、利用key值对密码进行加密,并将加密后的密码保存在服务器

3、登录的时候再一次利用保存在本地的key值进行HAMC加密,与服务器进行对比

提示:如果换了手机或是换了账号,就向服务器请求key值下来



MD5+HAMC加密(三种里最安全的做法)

1、利用hamc加密注册账号密码:(pwd+key).hamc = PWD

2、登录的时候(PWD + 从服务器拿到的当前时间).md5加密传送给服务器
3、服务器进行同样的(PWD + 从服务器拿到的当前时间).md5操作后进行对比,如果不一样,再进行一次时间为提前一分钟的判断,因为我们再登录的时候可能会是在某一分钟的最后几秒





0 0