update 2018-06-04php
2015年出的一个规范 JSON Web Token (JWT) https://tools.ietf.org/html/rfc7519
css
JWT 官网: https://jwt.io/
html
八幅漫画理解使用JSON Web Token设计单点登陆系统: http://blog.leapoahead.com/2015/09/07/user-authentication-with-jwt/
linux
JSON Web Encryption (JWE) : https://tools.ietf.org/html/rfc7516
android
JSON Web Signature (JWS) : https://tools.ietf.org/html/rfc7515
git
update 2017-9-6 github
微信交互协议和加密模式研究:https://github.com/hengyunabc/hengyunabc.github.io/files/1280081/wechat.pdf算法
---数据库
移动App该怎样保存用户password?浏览器
这个实际上和桌面程序是同样的。
參考:http://bbs.pediy.com/archive/index.php?t-159045.html,
桌面QQ在2012的时候把passwordmd5计算以后,保存到本地加密的Sqlite数据库里。
參考:http://blog.csdn.net/androidsecurity/article/details/8666954
手机淘宝是经过本地DES加密,再把password保存到本地文件中的,假设拿到ROOT权限,能破解出password明文。
參考:http://www.freebuf.com/tools/37162.html
我实际測试了下。可以轻松获得所有账号的password明文。
參考:http://blog.csdn.net/lqhbupt/article/details/7787802
linux是经过加盐(salt),再hash后,保存到/etc/shadow文件中的。
貌似曾经的发行版是md5 hash,如今的发行版都是SHA-512 hash。
linux用户password的hash算法: http://serverfault.com/questions/439650/how-are-the-hashes-in-etc-shadow-generated
其实是调用了glic里的crypt函数,可以在man手冊里查看相关的信息。
可以用如下的命令来生成:
mkpasswd --method=SHA-512 --salt=xxxx
当中salt參数,可以本身设置,最好是随机生成的。
可以用 mkpasswd --method=help 来查看支持的算法。
看完上面一些软件的作法以后,咱们来探讨下,用户password该怎样保存。还有能作到哪一种程度?
这个其实是从用户的角度出发。即便数据泄露了。影响降到最低。
这点对于移动设置是很是重要的。比如今天用户连到了一个恶意的wifi,假设攻击者截获到请求,要防止攻击者潜伏几天,或者几个月以后的攻击。
必须要让请求的凭据在一天或者几天内失效。
假如不加盐,那么攻击者可以依据相同的hash值获得很是多信息。
比方站点1的数据库泄露了,攻击者发现用户A和用户B的hash值是同样的,而后攻击者经过其余途径拿到了用户A的password。那么攻击者就可以知道用户B的password了。
或者攻击者经过彩虹表。暴力破解等方式可以直接知道用户的原来password。
因此。每个用户的salt值都要是不同的,这点參考linux的/etc/shadow文件就知道了。
应该用哪一种算法来存储?
从上面的资料来看。手机淘宝是本地DES对称加密,显然很是easy就可以破解到用户的真实password。
QQ也是对称加密的数据库里,存储了用户password的md5值。
显然对称加密算法都是可以逆向获得原来的数据的。那么咱们尝试用非对称加密算法,比方RSA来传输用户的password。
那么用户登录的流程就变为:
有的人会说。假设server的私钥泄露怎么办?
server端换个新的密钥,强制client下载新的公钥或者升级。
可以考虑有一个专门的硬件来解密,这个硬件仅仅负责计算。私钥是一次性写入不可读取和改动的。搜索 rsa hardware,貌似的确有这种硬件。
固然。即便真的私钥泄露,世界同样运转。像OpenSSL的心血漏洞就可能泄露server私钥。但你们日子同样过。
非对称加密算法的优势:
这点其实是怎样让client保存的加密串及时的失效。
比方:
攻击者是否会潜伏很是久?
如下提出一种 salt + 非对称加密算法的方案来解决问题:
同理,假设某木马大规模窃取到了大量的用户本地加密串,那么可以把缓存中所有用户的salt都清除,那么所有用户都要又一次登录。注意用户的password不用改动。
注意,为了简化描写叙述,上面提到的用户的password,可以是先用某个hash算法hash一次。
浏览器的登录过程比較简单,仅仅要用RSA公钥加密password就可以了。
防止中间人截取到明文的password。
App因为要实现本身主动登录功能。因此一定要保存一些凭据。因此比較复杂。
App登录要实现的功能:
这里推断时间,主要是防止攻击者截取到加密串后。可以长久地利用这个加密串来登录。
再把加密结果返回给client。
屡次md5或者md5 + sha1是没什么效果的。
RSA算法最好选择2048位的。
搜索" rsa 1024 crack"有很是多相关的结果,google已经将其SSL用的RSA算法升级为2048位的。
怎样防止登录过程的中间人攻击。可以參考,魔兽世界的叫SPR6的登录算法。
对于网页登录,可以考虑支持多种方式:
严格要求的应用,最好用JS实现RSA加密。在github上找到的一个JS RSA库:https://github.com/travist/jsencrypt
server用salt(存数据库的) + hash算法来保存用户的password。
用salt(存缓存的,注意和上一行的salt是不一样的)+ RSA算法来加密用户登录的凭证。
这样server可以灵活控制风险,控制用户登录凭据的有效期,即便用户数据泄露。也不须要改动password。