1.起源
军事领域 运用最广
对数据加密进行保护
凯瑟大帝 --凯瑟密码本
一直持续用到上世纪70年代 二战
美日对战 美军几乎截获所有日军电报
AF 中途岛 歼灭日军所有海军力量
明文--密文
A--a
B--b
类似
base64
RSA 的出现结束了密码本的时代
RSA公钥加密算法是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。1987年7月首次在美国公布,当时他们三人都在麻省理工学院工作实习。RSA就是他们三人姓氏开头字母拼在一起组成的。
RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则需要用另一个才能解密。
破解方法:因式分解
哈希(散列)函数 取摘要
- MD5
- SHA1/256/512 强度
- HMAC(很多大企业在用!!) 非常安全
对称加密
- DES(数据加密标准,目前用的少)
- 3DES()
- AES(高级密码标准,美国国家安全局使用) 苹果的钥匙串访问就是用的AES
散列函数特点
- 算法公开的
- 对相同的数据加密,得到的结果是一样的,算法一样
- 对不同的数据加密,得到的结果是定长的(MD5加密得到32个字符)
- 不能反算(不可逆)
- 信息摘要,信息“指纹” 备案
- 散列碰撞 -- 王小云
数据完全的原则
用户的习惯 密码一样的 QQ 微信 ……
1.在网络上不允许“明文”传递用户隐私信息
2.在本地上不允许“明文”保存用户隐私信息
实际开发时,哈希,对称,非对称 是结合使用的
用途
- 密码
导入一个纯swift写的MD5加密文件
为了保持客户端与服务器一致,现在有两个做法1.服务器和客户端一样的加密 2.更加暴力的直接是32位的哈希值
在真实的开发中,服务器保存的是哈希值,因为服务器也不能保存用户的明文信息的规定。
以前账号有找回密码,而现在只有重置密码,这是因为服务器也不知道密码是什么,因为哈希是不可逆的。
注册的时候保存的密码哈希值
这样的加密方式你认为安全了吗,1.不能反算 2.服务器都不知道密码。
现在隆重的介绍一个CMD5
123456:e10adc3949ba59abbe56e057f20f883e
456789:e35cf7b66449df565f93c607d5a81d09
……
这个网站比较2的把一些可能出现的词保存起来,类似密码本。
所以现在看来 直接MD5加密是不行的,不安全的。直接用sha1,sha256,sha512都是不行的
- 1.直接MD5 ---不够安全, 可以查询
- 2.加盐 -- (密码 + 盐).md5 早起的方案
//盐 要足够长
let salt = "aodfaod({sdf$%U@})fuadjfoefkjwefiy937ru4i12uh4r98y4rn#$dkfsf"
let str = password.appending(salt).md5String
很多人这么干
这样我们感觉已经很安全了 但
我们的盐是死的,一旦泄露就完蛋了 程序里面的代码你最清楚。
不涨工资就可以拍桌子了
比方说100万推广引进20万用户,一旦盐泄露,用户的信息就不安全,这时就要强制升级。用户就会损失,100万打水漂了
- 3.HMAC -- 最近几年,国内开始慢慢增多
HMAC是密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),HMAC运算利用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要作为输出。
HMAC 的用途
HMAC 算法主要应用于身份验证,用法如下:
随机数在注册时只保存一次
- 1.客户端发出登录请求
- 2.服务器返回一个随机值,在会话记录中保存这个随机值,这时客户端将永久保存这个随机数
- 3.客户端将该随机值作为密钥,用户密码进行 hmac 运算,递交给服务器
- 4.服务器读取数据库中的用户密码,利用密钥做和客户端一样的 hmac运算,然后与用户发送的结果比较,如果一致,则用户身份合法。
这么做有什么好处呢? 如果我们在登录的过程中,黑客截获了我们发送的数据,他也只能得到 hmac 加密过后的结果,由于不知道密钥,根本不可能获取到用户密码,从而保证了安全性。
现在有一个问题,我们卸载APP 更换手机等等,没有了随机数我们要怎么登录?
- 1.我们的登录都不是一次请求,没有key 就找服务器要。服务器给你
这个key是定期更换的,当你长时间不登录会提示更换密码
- 当客户端没有key时,向服务器要key,服务器不给,询问授权手机或者常用手机是否允许新手机登录。
例如:QQ,微信。 他们不一定用的就是HMAC,但HMAC一定能实现这样的功能
- 当客户端没有key时,向服务器要key,服务器不给,询问授权手机或者常用手机是否允许新手机登录。
现在我们的密码已经足够安全了,已经想不到怎么破解了。但是我们进入了一个死胡同里,我们要加密的不单单只有密码,还有数据。不管你怎么加密你都是向服务器发送那32位字符串,我为什么要破解你的密码。盗号什么的 就是 模拟登陆。群发消息,哥们最近手头有点紧,给充10元话费,只要量大,一天万八的没有问题。
服务器保存了账号的账号,HMAC密码,key
这时我们就不能直接发送HMAC密码了,要发送:(HMAC密码 +“201710171111”).MD5 “201710171111”客户端时间
以前服务器是对比HMAC密码,
现在服务器要对比两次
- HMAC密码 +“201710171112”).MD5 “201710171112”服务器的时间 这次对比一定是失败的 时间不对
2.(HMAC密码 +“201710171111”).MD5 “201710171111” 减一分钟
不要用本地时间 找服务器要
密码有时间限制的最长也就2分钟所以才是两次。登录超过2分钟提示密码错误!!,你想让用户登录时看小菊花2分钟,然后提示一个密码错误??别开玩笑了,登录超过20秒用户都会任务APP死掉了, APP不行。尤其是苹果手机的用户。
Android与iOS开发者最大的不同就是,Android的开发者写的不好没有关系,用户只会说破手机。 iOS用户就会说破APP。
注意 请求时间不要超过6秒,超过了也不要提示我们自己的原因,就说,你的网络环境不好,请换个宽广的地方试一试。
这样就做到 每次加密的结果都不一样,这就需要黑客必须在2分钟内搞定
安全没有绝对,只有相对安全。
怎么估算相对安全:破解所得到的价值是否大于破解所需要的成本
大于就是不安全
问:指纹能做登录密码吗?指纹能否代替密码?
答:不可以。密码:能确定你是这个账号的主人。指纹:能确定你是这个手机的主人