MD5算法

来源:互联网 发布:武术器材专卖店淘宝网 编辑:程序博客网 时间:2024/06/06 14:17

MD5:保存用户名和密码、校验数据的完整性(比如下载是否完整,是否在下载的过程中中病毒)、校验光盘(光盘会磨损的)的完整性。

说MD5其实进过算法产生的是固定的128bit,即128个0和1的二进制位,而在实际应用开发中,通常是以16进制输出的,所以正好就是32位的16进制,说白了也就是32个16进制的数字。

md5加密算法位数或结构简单的已经可以破解,可以对md5加密的数据字节拆分分段高地位加密,再加上特异处理;对于网络请求带着密码的,可以对密码+随机数md5加密再进行aes或rsa加密,随机数再rsa加密或aes加密传给后端,后端进行密码加随机数md5值校验。

iOS MD5加密的方法如下:

#import <CommonCrypto/CommonDigest.h>- (NSString *)md5:(NSString *)str{    const char *cStr = [str UTF8String];    unsigned char result[16];    CC_MD5(cStr, strlen(cStr), result); // This is the md5 call    return [NSString stringWithFormat:        @"%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x%02x",        result[0], result[1], result[2], result[3],        result[4], result[5], result[6], result[7],        result[8], result[9], result[10], result[11],        result[12], result[13], result[14], result[15]    ];}

其中%02x是格式控制符:‘x’表示以16进制输出,‘02’表示不足两位,前面补0;如‘f’输出为0f,‘1f3’则输出1f3;本来一般的都会介绍到这里就完了,我想多介绍一下代码中result是个字符数组,那为什么是[16]呢,这是因为MD5算法最后生成的是128位,而在计算机的最小存储单位为字节,1个字节是8位,对应一个char类型,计算可得需要16个char。所以result是[16]。那么为什么输出的格式一定是%02x呢,而不是其它呢。这也是有原因的:因为约定MD5一般是以16进制的格式输出,那么其实这个问题就转换为把128个0和1以16进制来表示,每4位二进制对应一个16进制的元素,则需要32个16进制的元素,如果元素全部为0,放到char的数组中,正常是不会输出,如00001111,以%x输出,则是f,那么就会丢失0;但如果以%02x表示则输出结果是0f,正好是转换的正确结果。


原创粉丝点击