问题背景:
现阶段存在的问题
1.数据库密码是明文
解决方法:通过加密或者hash变成密文
2.大量密码加密后或者hash后值相同.(因为很多用户密码相同)
解决方法:加盐搅拌使每个用户的密文不相同
这篇文章的目的是不同用户使用相同的密码的情况下增加破解难度.
解释第一个问题:
为了防止黑客直接拿到密码,所以密码不能以明文的方式存储.密码必须加密.
加密要么是无密钥(hash或者符号变换,hash的方法比后者好),要么是有密钥(单密钥势必要放在服务器的某个文件内,这里笔者推荐多密钥多重加密)
使用加密后有以下几点需要注意:
1.自己编写算法加密:这个不牢靠.没有经过测试的密码系统是不安全的密码系统.
2.使用MD5或者RSA这样的已知算法加密.
如果没有统计的密码字典这个方法是一个好方法.如果有了密码字典如果让用户自己输入很容易在字典上查到用户的密码.
3.使用多重密钥加密
密码强度等价于最强的一级.如果是MD5(SHA-1(MD5(密码)))=MD5(密码)或SHA-1(密码)
如果加密算法运算时间很长将严重影响服务器资源
那么我们将使用几种盐来搅拌使不同的用户密码不一样.
可以使用的盐:用户账户,注册的id(那个自增字段),电子邮件地址,最后登录时间等等.
定义函数:
pw=f(密文,各种盐);//这个用于有密钥的算法
//pw(密文,密钥)
pw=f(密文+各种盐);//这个用户hash算法
pw=f(密文)
通过这样的方法分别使用不同的各种盐之后就能让每个用户的不同了.
密文越长组合越多越难破解.所以在加密的过程中要尽可能的多使用几层.
比如3DES有一种方案是 p=DES(DES((DES(明文,密钥1),密钥2),密钥3)
这样在3DES中密钥的长度就从56位变成了3*156位.
我们的密钥存储在数据库中的密码经过多轮加密后约等于一个长密文加密.
比如pw=f(f(f("123456",blacksapper),3085521),20120312)大约=f("123456blacksapper308552120120312")
这个32位符合大概有100^32=10^64种组合.需要10^59PB的容量远大于字典的长度.
这样密码就比较安全了.
推荐的书上能够找到的加密算法3DES,AES,Two Fish ,Blow Fish,Md6,SHA-512.
阅读(1928) | 评论(0) | 转发(0) |