`
mushme
  • 浏览: 793034 次
  • 性别: Icon_minigender_1
  • 来自: 西安
社区版块
存档分类
最新评论

对旧的用户密码系统的改造

 
阅读更多
看到大家评论较多,就把方案加强了下

旧的系统密码存储的是md5(password),理论上md5在有限的时间空间内是不可逆的(实际上已经有人可以了)
一般使用md5(password),加加密后的密码进行保存
但这会有一个比较严重的问题,比如密码是123456的用户,存储的密码值都是e10adc3949ba59abbe56e057f20f883e
这样就会导致,如果被暴库后,可以拿已知的字典表来直接匹配了(所有e10adc3949ba59abbe56e057f20f883e的用户密码都是123456,这不是废话么)

一般的处理方式是加盐(salt),也就是md5(相对不变的内容+密码),这样即使密码一样,存储的内容也不一样,“相对不变的内容”一般会是用户名
这样的话,存储的是md5(userName+password)
这样就会好很多了,但是如果你的系统以前使用的md5(password),那么,你本身并没有存储password,要升级到这个方案,基本是不可行的。

md5(userName+md5(password)),这样的方案就优雅些了,也加了盐,也可以从原有的系统进行平滑升级
更好的方案:md5(userName+md5(password)+固定的二十位以上的字符串)
这样的话,密码的安全不再依赖于密码本身的简单或者复杂了,更多的是依赖于这二十位的字符串了,只要固定的字符串足够强壮,以至于目前的密码库都不存在此内容,那么及时用户使用了弱口令,也不影响安全。


贴一点代码吧,附件有完整的代码和jar包
package info.frady;

import org.apache.commons.codec.digest.DigestUtils;
public class CommonTest {

	public static void main(String[] args) {
		String salt="1qazXSW@3edcVFR$5tgbNHY^";
		String userName="frady";
		String password="123456";
		System.out.println(DigestUtils.shaHex(password));//sha(password),很少这么干
		System.out.println(DigestUtils.md5Hex(password));//md5(password),通用的做法
		System.out.println(DigestUtils.md5Hex(userName+password));//md5(userName+password),加强的做法,加了用户名做salt
		System.out.println(DigestUtils.md5Hex(userName+DigestUtils.md5Hex(password)));//md5(userName+md5(password)),兼容旧md5(password)升级的做法,用用户名做salt
System.out.println(DigestUtils.md5Hex(userName+DigestUtils.md5Hex(password)+salt));//md5(userName+md5(password)+salt),兼容旧md5(password)升级的安全做法,用用户名和saltstring做salt,强烈推荐
	}


}



没想到回复的人还很多,补充下:
1.此方案适合密码存储的是md5(password)旧系统的改造,一般这样的系统,没有机会再生成md5(password+salt)了,因为旧的系统中根本没有password!(如果你的系统中还有password,那你的代码我就不好评价了)
2.基于function的隐藏一般来讲意义不大,你所知道的function大家都能知道。我们需要的是告诉他function,但是他确逆不回来的,或者逆向难度非常大。md5就具备这样的特征,function大家都知道,但是逆向的成本非常大。
3.不通过逆向,用字典表直接查找匹配是md5目前最大的安全问题,但此方案使用的是md5(userName+md5(password)),如果userName至少是4位的话(注册的时候一般都有这个要求),那么userName+md5(password)至少得是36位了,即使我的userName是abcd,密码是abc123,好吧假设你是个有心的黑客,而且你有个强大的多的字典,以至于你的字典表里竟然有md5(abcde99a18c428cb38d5f260853678922e03),然后我确实得承认你胜利了。
这意味着即使username是四位,你的密码库得比你本来的库庞大(26个字母+10个数字)*(36)*36*36=1679616倍。167万倍的密码库,哥们,再说磁盘非常廉价,你也有点搞笑了。
4
5
分享到:
评论
21 楼 skzr.org 2013-06-09  
yixiandave 写道
weiqiang.yang 写道
我觉得密码变成md5(userName + md5(password))对于安全性的提升并不大
如果已经被拿到库了,那么毫无疑问肯定会尝试这个组合的

既然都加盐了,那就加彻底点
md5(userName + md5(password) + salt) // salt自定义,写代码里或配置文件里


一切的前提在于md5不易被破解

直接的md5(password)的方式容易被破解是因为很多常用字符串对应的md5编码是已知的。通过字典对照可以得到原来的password,从而影响用户其他账号的安全。

采用博主的方法后哪怕就是告诉你我的算法是md5(username+md5(password)),告诉你username和最后的md5结果你也解不出username+md5(password)这个字符串的。首先md5(x)的长度是固定32位,再加上username,长度达到了32位以上,不会有哪个字典能录入30位以上的对应md5编码了吧,使用穷举法则有16^32种可能,也就是2^128种可能,这个数字已经远远超过了直接穷举尝试用户名密码登陆的成本


我不赞同,为什么说知道了function就能知道密码:
  • 我们拿到了md5,所以通过字典知道了password*
  • 我们知道了function,那么我们可以构造新字典:newMd5=md5(function(password)),同理拿到了新的newMd5依然能通过字典法找到可能的密码

所以没有真正的安全可言。
20 楼 yixiandave 2013-06-09  
weiqiang.yang 写道
我觉得密码变成md5(userName + md5(password))对于安全性的提升并不大
如果已经被拿到库了,那么毫无疑问肯定会尝试这个组合的

既然都加盐了,那就加彻底点
md5(userName + md5(password) + salt) // salt自定义,写代码里或配置文件里


一切的前提在于md5不易被破解

直接的md5(password)的方式容易被破解是因为很多常用字符串对应的md5编码是已知的。通过字典对照可以得到原来的password,从而影响用户其他账号的安全。

采用博主的方法后哪怕就是告诉你我的算法是md5(username+md5(password)),告诉你username和最后的md5结果你也解不出username+md5(password)这个字符串的。首先md5(x)的长度是固定32位,再加上username,长度达到了32位以上,不会有哪个字典能录入30位以上的对应md5编码了吧,使用穷举法则有16^32种可能,也就是2^128种可能,这个数字已经远远超过了直接穷举尝试用户名密码登陆的成本

19 楼 weiqiang.yang 2013-06-09  
我觉得密码变成md5(userName + md5(password))对于安全性的提升并不大
如果已经被拿到库了,那么毫无疑问肯定会尝试这个组合的

既然都加盐了,那就加彻底点
md5(userName + md5(password) + salt) // salt自定义,写代码里或配置文件里
18 楼 ququjioulai 2013-06-09  
dzwfeng 写道
如果按照文中描述中说的被暴库了
那么userName是已经知道的,旧的MD5也推断出类似123456这样的密码
登录使用md5(userName+md5(password))和使用md5(password)是一样的
那就是升级的时候将md5(userName+md5(password))得到的数据修改到数据库的密码字段才行的吧。

作者只是提供一种思路,并不见得一定用userName,你可以加一些其他自己知道的字符串,而且暴库的人并不见得一定知道组成密码的规则,否则,任何办法都不可行。
17 楼 skzr.org 2013-06-08  
yixiandave 写道
skzr.org 写道
skzr.org 写道
这个方案很好。
我设计的是 md5(user.password + user.id)

老实说这种貌似也会被破解,因为user.name或者user.id,都能通过页面知道。

复杂点可能更好:
md5(user.password + function(user.password))

这样除非别人拿到你的function,否则他不知道这个可变因子的值。


大家讨论下啊


实际上可以看成md5(function(username,password)),不知道这个function细节的话很难去破解。
md5的逆运算虽然现在有一点办法了但是依然成本巨大,就以lz这种md5(username+md5(password))的算法,对方即使得到username和最终存储结果也是很难将md5(password)破解出来的


这个抽象不错,博主不说他是用的function=username+password,确实难破解了
16 楼 loookto 2013-06-08  
md5不是被山东的一个大妈破解了吗?再说你在后边加个随机数;我觉得要好点吧
15 楼 liyufu86 2013-06-08  
14 楼 shanlingyunjavafuns 2013-06-08  
MD5(password+key)
13 楼 yixiandave 2013-06-08  
skzr.org 写道
skzr.org 写道
这个方案很好。
我设计的是 md5(user.password + user.id)

老实说这种貌似也会被破解,因为user.name或者user.id,都能通过页面知道。

复杂点可能更好:
md5(user.password + function(user.password))

这样除非别人拿到你的function,否则他不知道这个可变因子的值。


大家讨论下啊


实际上可以看成md5(function(username,password)),不知道这个function细节的话很难去破解。
md5的逆运算虽然现在有一点办法了但是依然成本巨大,就以lz这种md5(username+md5(password))的算法,对方即使得到username和最终存储结果也是很难将md5(password)破解出来的
12 楼 skzr.org 2013-06-08  
skzr.org 写道
这个方案很好。
我设计的是 md5(user.password + user.id)

老实说这种貌似也会被破解,因为user.name或者user.id,都能通过页面知道。

复杂点可能更好:
md5(user.password + function(user.password))

这样除非别人拿到你的function,否则他不知道这个可变因子的值。


大家讨论下啊

11 楼 skzr.org 2013-06-08  
这个方案很好。
我设计的是 md5(user.password + user.id)
10 楼 hot002 2013-06-08  
yixiandave 写道
hot002 写道
yixiandave 写道
hot002 写道
密码允许存明文吗?

这个很早以前就没用明文了吧。。。存明文那是坑人啊,一旦拖库啥都知道了

是啊  文章里面有句
但是如果你的系统以前使用的md5(password),那么,你本身并没有存储password,要升级到这个方案,基本是不可行的。
这个方案是基于数据库有明文,才能改造啊?


笔者给出的新方案是:md5(userName+md5(password))
其中password未知,但不影响我们获得md5(password)

明白了
9 楼 yixiandave 2013-06-08  
hot002 写道
yixiandave 写道
hot002 写道
密码允许存明文吗?

这个很早以前就没用明文了吧。。。存明文那是坑人啊,一旦拖库啥都知道了

是啊  文章里面有句
但是如果你的系统以前使用的md5(password),那么,你本身并没有存储password,要升级到这个方案,基本是不可行的。
这个方案是基于数据库有明文,才能改造啊?


笔者给出的新方案是:md5(userName+md5(password))
其中password未知,但不影响我们获得md5(password)
8 楼 hot002 2013-06-08  
yixiandave 写道
hot002 写道
密码允许存明文吗?

这个很早以前就没用明文了吧。。。存明文那是坑人啊,一旦拖库啥都知道了

是啊  文章里面有句
但是如果你的系统以前使用的md5(password),那么,你本身并没有存储password,要升级到这个方案,基本是不可行的。
这个方案是基于数据库有明文,才能改造啊?
7 楼 yixiandave 2013-06-08  
hot002 写道
密码允许存明文吗?

这个很早以前就没用明文了吧。。。存明文那是坑人啊,一旦拖库啥都知道了
6 楼 yixiandave 2013-06-08  
wwwcomy 写道
rensanning 写道
多字段拼接会存在一个问题:
引用
userName password
a@a.com  123
a@a.com1 23


有道理

是不是能加入个特殊字符之类的 比如注册时候禁用的字符

这个问题不大的吧,登陆要用户名和密码同时匹配的
5 楼 hot002 2013-06-08  
密码允许存明文吗?
4 楼 yixiandave 2013-06-08  
还在用简单MD5加密的表示深受启发,当然加盐方案不止一种。
3 楼 wwwcomy 2013-06-08  
rensanning 写道
多字段拼接会存在一个问题:
引用
userName password
a@a.com  123
a@a.com1 23


有道理

是不是能加入个特殊字符之类的 比如注册时候禁用的字符
2 楼 rensanning 2013-06-07  
多字段拼接会存在一个问题:
引用
userName password
a@a.com  123
a@a.com1 23

相关推荐

    参考资料-楼宇对讲系统改造方案.zip

    本改造方案旨在优化现有楼宇对讲系统的功能,提升安全性及用户体验。下面将详细阐述改造方案中的关键知识点。 一、系统架构升级 传统楼宇对讲系统多采用模拟信号传输,易受干扰且安全性较低。改造时可考虑升级为...

    楼宇对讲系统改造方案.doc

    随着科技的飞速发展,智能化已成为现代生活的重要趋势,尤其在居住环境的...通过这样的系统改造,不仅提升了小区的硬件设施水平,更加大了居民对社区的满意度和信任度,从根本上提升了小区的整体品质和居民的生活质量。

    电力用户用电信息采集系统安全防护技术方案.pptx

    *采用非对称密钥算法和对称密钥算法的混合密码系统,以确保主站和终端通信的安全性。 *对称密钥算法主要用于通信数据的加解密。 *非对称密钥算法主要用于身份鉴别、密钥协商、对称密钥的更新。 *密钥管理包括:密钥...

    惠普助力智能公话系统改造案例

    【惠普助力智能公话系统改造案例】 "ST智能公用电话系统"是一个创新的电信解决方案,它结合了专用话机和智能公话平台的优势,提供综合的电信公话服务。该系统支持用户通过IC卡拨打电话,进行市话、本地网、国内国际...

    小区信息化系统改造方案研讨(共23页).doc

    【小区信息化系统改造方案研讨】 小区信息化系统的改造是现代社区管理的重要组成部分,旨在提升小区的安全性、便利性和智能化水平。本方案将详细探讨南瓯景园小区的信息化系统改造,包括智能停车场管理系统、可视...

    【旧楼改造】运营商楼宇对讲解决方案.pdf

    该方案的提出基于以下用户需求:老旧小区对讲系统大面积无法使用,国家政策推动旧改,用户有旧改需求。电子产品老化、物业维护差、产品停产、产品无标准、小区缺少专业技术人才以及网络得不到正常维护等,导致系统...

    超市订单管理系统源码-北大青鸟(学习使用)

    系统简介:主要功能介绍:(1)订单管理模块;(2)供应商模块;(3)用户管理模块等。 项目技术:主要运用Spring+Spring MVC+... 密码模块:主要包含对当前登入用户密码进行修改操作; 本资源仅供学习使用。欢迎下载。

    远程信息化培训系统升级改造主要功能总结.ppt

    【远程信息化培训系统升级改造主要功能总结】 随着信息技术的快速发展,远程信息化培训系统已经成为现代企业进行员工教育和技能培训的重要工具。然而,现有的在线学习网站存在一些不足,如平台稳定性差、功能简单、...

    统一认证单点登录系统SSO解决方案.doc

    这个过程涉及到安全验证,由单点登录管理应用服务器通过Web Service接口与各个应用系统服务器通信,验证用户提供的账号和密码,确保绑定的合法性。 其次,用户单点登录的流程设计是关键。当用户尝试访问应用系统时...

    JSP留言管理系统Ⅵ(MVC+DAO设计模式)

    本系统——"JSP留言管理系统Ⅵ"就是结合这两种模式实现的一个实例,旨在提供一个用户友好、数据处理高效且易于维护的在线留言平台。 **1. MVC设计模式** MVC模式是一种将业务逻辑、视图展示和数据访问分离的设计...

    老旧小区智能化升级改造项目解决方案.doc

    ### 老旧小区智能化升级改造项目解决方案 ...总之,通过对老旧小区进行全方位的智能化升级改造,不仅可以显著提升居民居住体验,还能有效促进小区管理现代化进程,为打造宜居、安全、舒适的社区环境打下坚实基础。

    易语言棚户区改造管理系统

    易语言棚户区改造管理系统源码,棚户区改造管理系统,记录保存密码信息,取出保存密码信息,读加密配置项,写加密配置项,取加密配置节名,取加密配置项名,删除加密配置小节,配置文件_写用户信息,配置文件_删除用户,配置...

    [经典]Openfire整合现有用户

    在企业环境中,通常需要将Openfire与现有的用户管理系统进行整合,以便利用已有的用户数据,如LDAP(轻量级目录访问协议)或数据库中的用户信息。本文将详细介绍如何将Openfire与现有的用户资源进行整合,并扩展其...

    远程信息化培训系统升级改造主要功能总结.pptx

    总的来说,远程信息化培训系统的升级改造旨在解决现有在线学习平台的问题,提升培训效率,优化用户体验,同时满足企业多元化、个性化的培训需求。通过强化核心功能、完善管理模块、优化学习模式和提高系统性能,将有...

    纯servlet用户管理系统

    【标题】"纯servlet用户管理系统"涉及到的核心技术是Servlet,这是一种Java服务器端编程技术,用于处理和响应HTTP...开发者通过学习和实践,实现了对韩顺平教程的个性化改造,展现了对Web开发基础的理解和应用能力。

    学生信息管理系统软件需求说明书

    1. **用户登录**:用户需要通过用户名和密码进行身份验证,只有验证成功的用户才能访问系统,确保系统安全。 2. **学生信息管理**:包括添加、查询、修改和删除学生个人信息的功能。这要求系统具有完善的数据库支持...

Global site tag (gtag.js) - Google Analytics