zoukankan      html  css  js  c++  java
  • 密码安全存储与登陆的方案

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

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

    从思想上重视数据安全

    一个健壮的系统应该是:

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

    这也是为什么大家不必实现自己的加密算法,而是使用公开的加密算法的原因,比如: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.密码如果被破解,危害的不仅仅是本系统

  • 相关阅读:
    char*,const char*和string的相互转换[转]
    1.0到2.0 的变化
    Hello项目分析
    VS上编译Lua5.1.4生成静态库
    cocos2dx 自带动画
    asp.net2.0安全性(Login系列控件)
    用js实现的对css的一些操作方法
    mapxtreme开发小结3(c#)
    asp.net页面事件执行顺序
    access与SqlServer 之时间与日期及其它SQL语句比较
  • 原文地址:https://www.cnblogs.com/-wenli/p/12807349.html
Copyright © 2011-2022 走看看