彩虹表

密码一般采用不可逆的加密方法,几乎所有的算法都是基于“取余数”。
简单来说,就是“被除数”是密码明文,“余数”是存储在数据库中的密码密文,“除数”就是加密过程,而“商”则被丢弃了。

验证密码时,取得用户输入的密码明文,进行运算,将获得的密文与数据库记录比较,如果相符,则认为密码正确。

因此,理论上来说,即使攻击者获得了密码密文,也不可能获得密码明文。

但是事实上很不幸,现在存在“彩虹表碰撞“这一方法。

所谓的”彩虹表“是一份存储了大量的普通加密方法的明文、密文对照的数据库。
因为”检索“一定比”加密运算“快很多,所以使得暴力破解成为可能。
例如,彩虹表中记录,“123456”的md5是“e10adc3949ba59abbe56e057f20f883e”。这样攻击者在只需要在彩虹表中查后面那一串密文,就能知道密码明文是123456
所以说,简单的直接加密存储已经难以满足要求。

现在流行的比较安全的普通加密存储密码的方法,是“MD5+盐”法。
假设说用户的密码是123456,用户名是abc,网站名是ABC,那么数据库中存储的密码是ABCabc123456的MD5值。因为MD5的算法,明文只要改变一点,密文就会改变很多。所以说即使攻击者知道了ABC和abc,只要彩虹表中没有ABCabc123456对应的值,那么攻击者还是什么都不知道。这里面的网站名和用户名,被称为“盐”。

在这种情况i啊,即使一个人在两个网站使用了相同的用户名和密码,加密得到的密文仍然是不同的两个,这就是所谓的“一站一密(码)”。即使在同一网站,两个不同的用户名使用了同样的密码,得到的仍然是不同的密文,这就是所谓的“一人一密”。这样就无形中增加了总密码密文的数量,使得所需的彩虹表体积大幅增加。

假设5个仅仅使用普通MD5加密的网站,每个网站都有相同的1000个用户,攻击者可以拿一个100G的彩虹表破解。
那么如果是使用MD5加盐的加密法,攻击者就需要5000倍大小的彩虹表,也就是500T。

所以,尽管MD5加盐的办法也不是绝对安全(理所当然是不存在绝对安全)的,但是仍然可以作为一个标准化的密码加密存储解决方案。

————————————————

再补充一下关于密码传输的问题。
0. 默认HTTP会用明文传输密码。
1. 最安全(但是高成本)的做法:使用SSL。
2. 简单安全的做法:在网页使用javascript进行加密,然后传递密码密文。服务器端直接拿收到的密文和数据库做比较。
3. 使用其他的富客户端——例如Java Applet, Silverlight之类的,加密后传递密码。
4. 奇葩的做法:用户首先输入用户名,然后服务器返回密码密文,本机加密密码明文后作比较,向服务器发送比较结果。

————————————————

补充:关于工作量。
编程的工作量:标准的加密方法,都有现成的代码可以使用,编写程序时增加的工作量很小。
系统的工作量:加密运算是需要很多计算的,所以当然会增加系统的工作量——只是需要进行加密运算的次数很少(注册时运算一次、每次登陆时运行一次、重设密码时运行一次),所以时间复杂度是O(n),n是“登录人次”),呈线性增长,所以对系统的压力,在n较小是可以忽略不计。
维护的工作量:无论明文还是密文存储密码,均极少需要人工维护,工作量的增加可以忽略不计。
用户的工作量:注册及输入密码是工作量不变。明文存储密码可以进行“找回”;密文存储密码不可找回,只能重置。所以用户一旦忘记密码,使用密文存储密码的系统,用户需要进行两步操作;而使用明文的,可能只需要一步就可以了(如果用户不需要修改密码的话)。

总的来说,工作量增加的很小,安全性增加很多,因此采用加密方案是理所当然的。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值