写在前面
MD5 (message-digest algorithm 5)叫信息-摘要算法。它并不属于加密算法,而是一种利用散列算法计算原文得到一个固定结果(信息摘要)的算法。特点:
- 计算后的结果长度固定
- 计算后的结果不可逆(不是加密算法的主要原因)
- 计算速度快MD5的实现原理
简单解释
- 就是不论原文是什么,不论长度是多长,利用MD5计算以后,得到的结果都是128 bit位的串,常用32位16进制来表示,可以使用md5在线解密破解,md5解密加密
验证。相同的原文计算后得到的MD5值必须一致;不同的原文计算后的结果必须不一致,这一重要的特点也使得其在安全认证方面起着至关重要的作用。
举个例子
原文1:我爱中国
MD5值:CEAE14BA773B77B2D40CF95CBB2181B8
原文2: 附近的飞机多家分店加肥加大发精度较福建的附近大口径飞快的积分交贷款就疯狂夺金开发就打开积分看到接口发交贷款分机的咖啡机看得见风
MD5值:B9D4D68569FCF9F109FAAD2966F30FAE
- 不可逆性,就是说我们无法通过计算后的MD5值还原回原文。正如上面我加密的字符串原文,我们无法利用B9D4D68569FCF9F109FAAD2966F30FAE去还原上面那一大坨文字。
- 计算速度快,这一点可以参考文章MD5的实现原理自己体会。可以思考下,给一个10个G的文件,计算它的MD5值。
作用
- 一致性检验
- 数字签名
- 数字证书(安全认证)
例如:在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了,这一点其实就是使用了一致性检测。
数字签名
数字签名(又称公钥数字签名)是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。它是一种类似写在纸上的普通的物理签名,但是使用了公钥加密领域的技术来实现的,用于鉴别数字信息的方法。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。数字签名是非对称密钥加密技术与数字摘要技术的应用-----百度百科
数字签名的作用就是说,我对某一份数据打个标记,可以确切的证明这份数据是我的。然后我发送给其他人,其他人可以知道这份数据是经过我认证的,数据没有被篡改过。
图1.png
- 首先利用一种算法,算出原始数据的摘要。需满足 a.若原始数据有任何变化,计算出来的摘要值都会变化。 b.摘要要够短。这里最常用的算法是 MD5。
- 生成一份非对称加密的公钥和私钥,私钥我自己拿着,公钥公布出去。
- 对一份数据,算出摘要后,用私钥加密这个摘要,得到一份加密后的数据,称为原始数据的签名。把它跟原始数据一起发送给用户。
- 用户收到数据和签名后,用公钥解密得到摘要。同时用户用同样的算法计算原始数据的摘要,对比这里计算出来的摘要和用公钥解密签名得到的摘要是否相等,若相等则表示这份数据中途没有被篡改过,因为如果篡改过,摘要会变化。
可以参考文章数字签名和数字证书的原理解读(图文)来更进一步理解数字签名的原理
IOS开发中生成MD5值
建立NSString的分类:
.h文件内容如下:
@interface NSString (MD5)
/**
* md5加密的字符串
*
* @param str
*
* @return 加密后的值
*/
+ (NSString *)md5:(NSString *) str;
@end
.m文件如下:
#import "NSString+MD5.h"
#import <CommonCrypto/CommonDigest.h>
@implementation NSString (MD5)
+ (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]
];
}
@end
具体使用:
NSString *str = @"我爱中国";
NSString *rest = [NSString md5:str];
NSLog(@"rest===%@",[rest uppercaseString]);
//输出结果
rest===CEAE14BA773B77B2D40CF95CBB2181B8
网友评论