【哈希(散列函数)】
MD5
SHA1
SHA256(512)
【对称加密算法】
DES
3DES
AES(高级密码标准,美国国家安全局使用的加密算法)
Ps:苹果内部的钥匙串访问用的就算AES。
【非对称加密算法 】
RSA
1、数据不可反算(不可逆运算)。
2、算法公开。
3、对相同的数据加密,得到的结果是一样的。
4、对不同的数据加密得到的结果是定长。 (MD5 -> 32个字符。10G电影->32个字符)
5、信息摘要,信息“指纹”。
服务器的逻辑:
1、服务器只会保存用户加密之后的32位的字符串!!
2、服务器在用户注册的那一刻就保存了明文密码加密之后的字符串!!
如果服务器保存的原始密码,请啪啪打脸你们的后台。
网站进行加密
https://md5jiami.51240.com/
终端进行加密
pwd = pwd.md5String
非常不安全。三岁小孩都能破。
更别说传明文密码了。真的是要死。
什么?不会破?
给你个链接:http://www.cmd5.com/
24万亿条数据来给你对比。
早期的一种方式。
盐要足够复杂。(shift+数字键盘,胡乱的拍~)
拼接字符串加盐,然后md5,就相对比较安全。
static NSString * salt = @"lkajsd;flj)(*@$!#(*&OJKD(*&)291IOJPOIHOIDS@#$U(*)_Q#R()IJD*(F_U";
pwd = [pwd stringByAppendingString:salt].md5String
但是有个问题哈,如果某一天这个程序员搞事情,有矛盾,这哥们把盐泄露了。就GG了。
那你说,离职了改盐啊,那你低版本的用户请问如何登录?
强制用户都重置密码啊!
那你就666了。
所以说盐一旦写死,就不可更改了。
目前非常流行,而且很多大公司在用。
使用一个密钥加密,做两次散列!
pwd = [pwd hmacMD5StringWithKey:@"key"];
在真实的开发中,这个key从服务器获取。
啥时候获取?
获取验证码返回或者登录前多做一次网络请求啊,根据需求来搞。
【使用HMAC加密的流程】
注册:
1、发送账号给服务器。
2、然后服务器随机生成一个密钥key返回给客户端。
3、客户端把这个key保存在本地。(推荐钥匙串)
4、输入密码 HMAC加密,服务器保存一个密码。
换了手机后:
1、先判断本地有没有密钥。
2、没有密钥,服务器返回密钥
那么就会出现个问题,我每次拿个新手机,登录下别的手机号,你就把密钥给我岂不是不安全?然后我再拼拼凑凑密码,试一试,搞一搞。
所以,类似于设备锁的东西就出来了。
设备锁的问题:
用了新手机,服务器向老设备发送请求,是否同意新手机登录,同意了,后台给新设备发送key。这样就可以大部分的避免胡乱下发key。
如果没有类似设备锁的东西,可以通过手机验证码,邮箱等等,确定是否发送key给新设备。
总之,下面验证这步,要尽量安全就可以了。
【有些黑客是拦截网络请求,不需要知道你的real pwd,而是模拟登录进行操作。】
我们的目标:每次登录的请求的字符串都不一样!!!
//密码hmac + 时间 ,然后md5
(密码.HMAC + "201703182138" ).md5
请求的时候,一般都是返回服务器的时间戳。避免用户手机时间不对。
在合适的地方网络请求得到服务器的时间。
服务器保存的是 密码.HMAC
,
然后后台对比现在的时间,然后 .md5
,
如果现在对比不成功,继续对比上一次的时间 然后.md5
。
对比两次是留下网络延迟的时间。
两次验证都不成功,则失败。
黑客一般都是获取了大量的用户数据后,统一进行破解操作,所以加个时间限制,更安全。
在使用搜索引擎的时候,几个关键字不管我们如何颠倒关键字,得到的搜索的结果都是一致的。
原理:
比方说,搜索的时候,有两个关键字 A & B。
不管A和B的位置如何,只要A 的MD5值 和B的MD5值 相加,和是一样的,搜索出来的结果就是一样的。
A + B = B + A = result
比如说有两个图片:一个是原图A,一个是截屏原图得到的图片B。
虽然二者看起来差不多,肉眼不那么容易识别,但是正版A和盗版B的md5值是完全不同的。(和文件名无关、和后缀名无关)
MD5是根据文件内容的二进制进行加密的,但是文件内容稍微有些不同,md5后的结果也是非常大的。所以通过MD5后的结果很容易看出来哪个是假的。
但是如果是复制,把磁盘的二进制进行复制,得到的内容是一致的,这个时候就判断不出来了。但是我们市面看的都是作者源文件进行更改后发布的,源文件是进行备案的,所以源文件只有作者知道。只要对比MD5,和备案的一匹配结果就出来了。
Tips:
文件压缩后,md5的值是不一样的。
解压缩后,md5的值和源文件是一样的。
百度云有个秒传功能。
原理:
对比文件的MD5值!!只要二者文件的MD5值相同,就会秒传。
如何更改文件的MD5值呢?
方法1、压缩一下。你的MD5值就变了。
方法2、采取一种编码方式改变MD5。
推荐用base64(base64是可以反算的)。
base64 皮卡丘.png -o 芈月传.txt
base64 芈月传.txt -o 皮卡丘.png -D
如果我们想保存我们个人比较安全的资料,我们可以自定义个算法,修改这个芈月传.txt
里面的内容,然后保存。
取出的时候,运用这个算法,得到正确的芈月传.txt
内容,然后base64回来原来的皮卡丘.png
.
查看文件的MD5值。
WiKs-Air:Desktop WiKi$ md5 /Users/apple/Desktop/iOS新技术.png
MD5 (/Users/apple/Desktop/iOS新技术.png) = 7e2c1e5a0f19a301902465cf2f362716
WiKs-Air:Desktop WiKi$ md5 iOS新技术.png
MD5 (iOS新技术.png) = 7e2c1e5a0f19a301902465cf2f362716
闲谈:是否可以用指纹登陆?
当然不可以啦!
指纹:判断这个人是否是手机的主人
密码:判断这个人是否是账号的主人