首先MD5是密码学中很经典的一种算法。说起密码学,它是一门很深、用途领域很广的学科,国家机密文件、军事领域等等都有用到密码学。上世纪70年代出现了一个非常伟大的加密算法RSA(这是三个人的名字简写)。
RSA-加密算法:该算法是公开的。特点:1.公钥加密,私钥解密 2.私钥加密,公钥解密。破解方式:因式分解,但是一般需要很长的时间,很难破解。
介绍一下开发中常用的几种算法:
1.哈希(散列)函数。 哈希函数中常见的算法有:MD5、SHA1、SHA256/512(SHA1、SHA256/512这几个底部原理都是一样的只是,加密强度不一样而已)
特点:a.算法是公开的。b.对相同的数据进行加密得到的结果是一样。c.对不同的数据进行加密得到的结果是等长,一个32位字符。常用于密码加密。
2.对称加密算法。 对称加密中常见的算法有:DES、3DES、AES(高级密码标准,美国国家安全局就是使用该算法,当时Mac上面的钥匙访问也是使用该算法,所以比较安全)
3.非对称加密算法。
下面我们依次对这3种算法进行介绍。
一.哈希(散列)函数。
1.简单的MD5加密。
NSString *pwd =@"安美发的密码很强,你猜不出来";
pwd = pwd.md5String;
缺点:加密过于简单、单一,通过一些网址很多值都能够找到!不安全。http://www.cmd5.cn/
2.一种早期的加密方式,加盐(必须非常长,足够复杂)。定义一个盐:staticNSString * salt =@")I{HDSFIUQH{OKJC{(DUKLJXPOIY_(*^&*Q%D(&^Q%W*&^)Q*(^D)Q&WD()*&QW)(*DY)QW(HDPIUWHQFPOIHJ:OASKDFJ:KJSDFPOIJ{DSOIJF";
pwd = [pwd stringByAppendingString:salt].md5String;
缺点:盐是写死的!一旦盐泄露!就不安全了!
3.HMAC加密。其实本质上还是哈希,在实际的开发中,密钥来自于服务器!!这样变得更加安全,当然大型的公司为了更加安全,还判断了授权手机,如果账号换了手机登录,服务器不会直接把key返回给客服端,需要一次授权请求后,授权请求成功服务器才会把key返回客服端。
pwd = [pwd hmacMD5StringWithKey:@"安美发的密码很强,你猜不出来"];
4.防止黑客攻击的安全加密方式。
//客服端 密码经过HMAC加密后得到的32位字符 string,然后(string+201710161643(当前时间搓)).md5String=string2。string和string2传给服务端
服务器得到客服端发送的数据,然后(string + 201710161643).md5 = string3,string2和string3做字符串对比,如果相等登录成功,如果不相等,又取下一秒钟的时间搓, (string + 201710161642).md5 = string4,tring2和string4做字符串对比。这样依次做对比,直到对比相等就登录成功。
NSString *string = [pwdhmacMD5StringWithKey:@"安美发的密码很强,你猜不出来"];
NSString *string2 = [NSStringstringWithFormat:@"%@%@",string,@"201710161643"];
NSString *string3 = [NSStringstringWithFormat:@"%@%@",string,@"201710161643"];
if ([string2 isEqualToString:string3]) {
NSLog(@"登录成功");
} else {
NSLog(@"登录失败");
}
大概说一下思路:
客服端:对数据报文本身进行一次Hash算法 --> 对HASH进行RSA(非对称加密) --> 得到新的HASH,new的HASH就是所谓的数字签名 --> 最后客服端将数据报文、数字签名一起通过对称加密发给服务端-->服务器端对数据报文同样的通过md5加密后得到字符串string1,对数据签名反编译成字符串string2,对比字符串string1和string2是否相等来判断数据是否被篡改过。
//当然为了更加安全,有些应用还在数据报文后面自定义字符串,例如:数据报文 +自定义字符串。
对数据报文本身进行一次Hash算法 + 自定义字符串进行一次Hash算法 --> HASH -->对HASH进行RSA(非对称加密) --> 得到新的HASH,new的HASH就是所谓的数字签名 --> 最后客服端将数据报文、数字签名一起通过对称加密发给服务端 --> 服务器端对数据报文同样的通过md5加密后得到字符串string1,对数据签名反编译成字符串string2,对比字符串string1和string2是否相等来判断数据是否被篡改过。
最后介绍密码和指纹的区别。
密码:代表是这个账号的主人,知道密码就可以进行账号登录。
指纹:代表是是这个手机的主人,设置指纹时是针对于手机。手机里面的app是不能开发指纹这个功能的,因为指纹是针对于手机而言。app开启指纹支付,理解为手机授权给某个app使用手机的指纹功能。同一个手机的某个应用当登录两个不同账号时可以使用该手机的指纹功能,但是当你切换不同账号时,很多app的指纹支付功能有可能会被关闭的,毕竟提到关于支付、钱的东西的安全防范还是做好点。