密码安全存储与登陆的方案

原文链接:用户登录最佳实践(基于慢哈希)

更多阅读:数据库里账号的密码,需要怎样安全的存放?

从思想上重视数据安全

一个健壮的系统应该是:

即使被拿走了数据和所有的代码,也没办法破解里面的数据。

这也是为什么大家不必实现自己的加密算法,而是使用公开的加密算法的原因,比如:ECC、AES、3DES 、SHA等等。既然无法保证加密代码不被泄露,那就使用公开的加密算法,只要保护好私钥信息,就算你知道我的加密方式也没有任何帮助。

工作重点由原来防止数据泄露,到防止还原数据中。

用户在客户端输入密码,到网络传输,到服务器数据存储,都使用正确的方法

客户端如何加密用户口令

1.在WEB程序中,永远不要使用明文传输密码

2.客户端公钥不要和用户名产生关系,否则黑客会检测用户名是否有效。

3.公钥从服务器端获取,客户端和网络传输层无法获取私钥,网络传输层无法解密加密的密码

客户端可以使用:ECC(SHA3_512(password),publicKey)

提示:不要告诉用户用户名是否错误

    不要告诉用户到底是用户名错了,还是密码错了。只需要给出一个大概的提示,比如“无效的用户名或密码”。这可以防止攻击者在不知道密码的情况下,枚举出有效的用户名。

如何保证传输环节口令安全

1.推荐使用HTTPS(SSL/TLS)

2.使用 HTTP 协议传输数据时,数据都是明文传输的,要保证用户口令数据的加密和被劫持后不可解密。

3.客户端和服务器端使用POST请求

4.服务器端检测来源页面,比如使用请求令牌(防止跨站攻击)

5.防止重复提交,比如使用同步令牌

6.恶意脚本检测,过滤SQL注入、跨站脚本(XSS)等一切非法脚本运行...

服务器端如何保存用户口令

  • 客户端加密后,仍然需要在服务端再次加密

    如果后端不做处理,只是对比,那么黑客可以在不知道用户密码的情况下,随意使用任何一个人的账号登陆(重放攻击)

  • 软件加密推荐使用慢哈希算法:bcrypt

    可以有效抵御彩虹表攻击,即使数据泄露,最关键的“用户密码”仍然可以得到有效的保护,黑客无法大批量破解用户密码,从而切断撞库扫号的根源。当然,对于已经泄露的密码,还是需要用户尽快修改密码,不要再使用已泄露的密码。

  • 高安全需要使用硬件加密,选择适合的加密设备

正确保存密码方法:

1.(中高安全)软件加密:加盐慢 hash (含随机数)保存密码  bcrypt(SHA3_512(password))

2.(中高安全)软件加密:加盐慢 hash (含随机数)保存密码,hmacKey存储到其他服务器,只有特定的机器才能获取密钥   bcrypt(hmac(SHA3_512(password),hmacKey))

3.(高安全)硬件加密:专属加密通道,不解密,对比密码是否正确使用硬件加密设备

用户登录最佳实践流程图解

 

注意点:

1.第6步,为防止DDOS攻击,使用错误次数超过6次锁定,并配合设备登陆检测、异常登录验证等辅助安全措施

2.当服务器端的SESSION超时,客户端使用无效的公钥加密密码上传时,提示错误并重新下发公钥

3.第7步,使用Hmac512(SHA3_512(password),key)进行加密

4.第8步,使用Bcrypt.match(用户密码,数据库存储的Bcrypt值)方法对比密码是否正确

如何进行用户密码重置

当用户忘记密码的时候,怎样进行重置?

1.如无必要,尽量不要允许用户重置密码

2.通过电子邮件重置密码,需要随机生成一个一次性令牌,将这个令牌混入到一个重置密码的链接中

3.确保令牌只对一个账户有效,令牌有效期尽量短,使用即刻失效。重新请求令牌或登录成功时原令牌立即失效

4.链接中不要体现账户信息,并且只用来服务器端识别数据库中某条用户的记录

5.永远不要通过电子邮件向用户发送新密码

6.用户重置密码的时候随机生成一个新的盐值用于加密,不要重复使用之前密码的那个盐值

7.也可以使用短信验证码的方式下发重置密码链接,会比通过SMTP明文传输安全一些

未来主流加密趋势

2015年,支付宝推出8.0版本,新版本推荐用户升级6位数字支付密码,已设置的密码无法切换回原来的复杂密码。

2016年,京东推出6位支付密码

使用硬件加密机,能够彻底防止数据被还原。

未来的加密趋势:

1.传统的MD5、SHA1加密会越来越少

2.传统的加盐哈希也会越来越少

3.对于规模和资金都较小的公司,一般使用软件方式加密,如:加盐慢哈希、KEY专属通道、部分数据异地存储等

4.高安全使用硬件加密

5.错误次数锁定、设备登陆检测、异常登录验证、来源URL检测、跨站攻击检测等辅助安全措施越来越普及

本文章在实际工作中的意义

1.当前各个企业都有各类应用系统,用户名、密码登陆几乎涉及到开发的所有部门

2.使用安全的方式进行密码防护,能够保证密码不被破解,提高客户对系统的信任和认可度

3.数据一旦被泄露,从数据的价值方面考虑,公司损失巨大

4.数据一旦被泄露,社会上的舆论对公司的影响巨大

5.密码如果被破解,危害的不仅仅是本系统

原文地址:https://www.cnblogs.com/-wenli/p/12807349.html