用户密码存储方案:中国XX银行业务系统中实现方法总结

  MD5全称是Message-digest Algorithm 5(信息-摘要算法),用于确保信息传输完整一致。

   目前网络上介绍的用户密码存储方案中,大家都只强调了如“MD5加密存储”,而没有从原理上分析如此存储对于用户数据的保护原理,那么就让我来分析一下吧:D

  方法一:把用户密码MD5后存储起来,用于将来的校验。如用户“user1”的密码是“123456”,则将其MD5值“e10adc39 49ba59ab be56e057 f20f883e”存储起来。

  方法二:把用户密码MD5值计算MD5后存储起来,用于将来的校验,即网上所谓的“二重加密”或“二次加密”。如 用户“user1”的密码是“123456”,则将其MD5值“e10adc39 49ba59ab be56e057 f20f883e”做MD5( “14e1b600 b1fd579f 47433b88 e8d85291” )后存储起来。

 

  但无论是方法一还是方法二都有一个问题:可以使用数据词典中轻松查找反查MD5加密值对照的原始值,许多在线MD5破解的站点就是做的这个生意,他们是没有王小云老师的功底的。并且在用户使用这些站点进行加密的时候还在不断替他们完善着数据词典。

  为什么“安全的MD5”会“不安全”了呢?这个账可不能算到MD5的头上,而是错在设计方案上的严重漏洞:

  • 用户常用的密码是有限的;
  • 常用密码的使用频率是有统计数据支持的;
  • 同样的输入、同样的算法,必然有同样的输出;

  基于以上前提可得出如下结论:

  • 如果用户“user1”和“user2”都使用同一密码“123456”,无论是一次加密“e10adc39 49ba59ab be56e057 f20f883e” 还是二次加密“14e1b600 b1fd579f 47433b88 e8d85291” ,他们的密码存储值都是相同的;
  • 世界上所有密码系统如果出现了字符串“e10adc39 49ba59ab be56e057 f20f883e” 或“14e1b600 b1fd579f 47433b88 e8d85291”都可以初步推断其原始值为“123456”;

  因此为避免同一密码“123456”加密后存储为同样的值,在算法不变的前提下,只有改变其输入才能达到迷惑敌人的目的,也就是说给输入数据加入干扰值。

  对于干扰值的加入需要充分保障干扰后的唯一性。如果给“123”加入干扰值后为“123456”,那么这个干扰就成了无效干扰了。

  以下为我设计的三种干扰方案:

  1. MD5("用户名"+"分隔符"+"密码");
  2. 为应用生成一个UUID(全球唯一标识码)并记录下来,MD5("用户名"+"分隔符"+"UUID"+"分隔符"+"密码");
  3. 为每一个用户生成一个UUID并保存下来,MD5("用户名"+"分隔符"+"UUID"+"分隔符"+"密码");

  将10万量级用户名使用排名第一常用密码“123”加密后,反查我手中一份10亿量级数据词典:

  • 干扰方案1加密后值2对重复,反查出结果273个;
  • 干扰方案2加密后值0对重复,反查出结果0个;
  • 干扰方案3加密后值0对重复,反查出结果0个;

  干扰方案1效果较差,属于舍弃范围;干扰方案2效果不错,但如果敌人获知了干扰码,只需要重新生成数据词典量就可同干扰方案1同样效果;干扰方案3效果最佳,即使敌人获了所有干扰码,每尝试反查一个用户都要付出干扰方案2的计算量,为最优方案。在近期的中国XX银行业务系统中,我设计并选用的就是类似方案3的密码存储方案。

  当然,如果想更大程度地保障用户密码的安全,还需要结合其他方案,如:

  • 保障输入端安全:通过各种验证码(人机识别码、电子密钥)等技术保障;
  • 保障存储端安全:各种途径控制数据可见范围等;

  如果您还有更好的相关方案,还请发布出来大家共同探讨。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值