常见的密码加密措施

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

常见的密码加密措施
常见的密码加密措施
#
MD5
全称是Message-Digest Algorithm 5(信息-摘要算法5),理论上是⼀种单向的哈希散列,
特性:
输⼊任意长度的信息,经过处理,输出为128位的⼤整数(数字指纹)(32位16进制数);
不同的输⼊⼀般得到不同的结果(唯⼀性);
根据128位的输出结果不可能反推出输⼊的信息(不可逆);
强抗碰撞:想找到两个不同的数据,使它们具有相同的MD5值,是⾮常困难的。

MD5⽤途:
1、防⽌被篡改:
1)⽐如发送⼀个电⼦⽂档,发送前,我先得到MD5的输出结果a。

然后在对⽅收到电⼦⽂档后,对⽅也得到⼀个MD5的输出结果b。

如果a与b⼀样就代表中途未被篡改。

2)⽐如我提供⽂件下载,为了防⽌不法分⼦在安装程序中添加⽊马,我可以在⽹站上公布由安装⽂件得到的MD5输出结果。

3)SVN在检测⽂件是否在CheckOut后被修改过,也是⽤到了MD5.
2、防⽌直接看到明⽂:
现在很多⽹站在数据库存储⽤户的密码的时候都是存储⽤户密码的MD5值。

这样就算不法分⼦得到数据库的⽤户密码的MD5值,也⽆法知道⽤户的密码(其实这样是不安全的,后⾯我会提到)。

(⽐如在UNIX系统中⽤户的密码就是以MD5(或其它类似的算法)经加密后存储在⽂件系统中。

当⽤户登录的时候,系统把⽤户输⼊的密码计算成MD5值,然后再去和保存在⽂件系统中的MD5值进⾏⽐较,进⽽确定输⼊的密码是否正确。

通过这样的步骤,系统在并不知道⽤户密码的明码的情况下就可以确定⽤户登录系统的合法性。

这不但可以避免⽤户的密码被具有系统管理员权限的⽤户知道,⽽且还在⼀定程度上增加了密码被破解的难度。


3、防⽌抵赖(数字签名):
这需要⼀个第三⽅认证机构。

例如A写了⼀个⽂件,认证机构对此⽂件⽤MD5算法产⽣摘要信息并做好记录。

若以后A说这⽂件不是他写的,权威机构只需对此⽂件重新产⽣摘要信息,然后跟记录在册的摘要信息进⾏⽐对,相同的话,就证明是A写的了。

这就是所谓的“数字签名”。

MD5算法过程:
对MD5算法简要的叙述可以为:MD5以512位分组来处理输⼊的信息,且每⼀分组⼜被划分为16个32位⼦分组,算法的输出由四个32位分组组成,将这四个32位分组级联后将⽣成⼀个128位散列值。

基本操作,求余、取余、调整长度、与链接变量进⾏循环运算。

第⼀步、填充:如果输⼊信息的长度(bit)对512求余的结果不等于448,就需要填充使得对512求余的结果等于448。

填充的⽅法是填充⼀个1和n个0。

填充完后,信息的长度就为N*512+448(bit);
第⼆步、记录信息长度:⽤64位来存储填充前信息长度。

这64位加在第⼀步结果的后⾯,这样信息长度就变为N512+448+64=(N+1)512位。

** 第三步、装⼊标准的幻数(四个整数):**标准的幻数(物理顺序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D= (76543210)16)。

如果在程序中定义应该是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。

第四步、四轮循环运算:循环的次数是分组的个数(N+1)
MD5安全性:
普遍认为MD5是很安全,因为暴⼒破解的时间是⼀般⼈⽆法接受的。

实际上如果把⽤户的密码MD5处理后再存储到数据库,是很不安全的。

因为⽤户的密码是⽐较短的,⽽且很多⽤户的密码都使⽤⽣⽇,⼿机号码,⾝份证号码,电话号码等等。

或者使⽤常⽤的⼀些吉利的数字,或者某个英⽂单词。

如果我把常⽤的密码先MD5处理,把数据存储起来,然后再跟你的MD5结果匹配,这时我就有可能得到明⽂。

⽐如某个MD5破解⽹站/default.aspx ,把其⽹站下的公告复制如下:
md5破解、动⽹论坛密码破解等不再需要⽤穷举法,本站共有md5记录235亿条,还在不断增长中,已包含10位及10位以下数字、7位字母、部分7位字母+数字,全部6位及以下字母加数字等组合,并针对国内⽤户做了⼤量优化,例如已经包含所有⼿机号码、全国部分⼤中城市固定电话号码、百家姓、常⽤拼⾳等⼤量组合,另加⼊了某⼤型⽹站真实会员密码数据10万条。

本站数据量⼤,查询速度快,同时⽀持16位及32位密码查询。

通过对10万会员的真实动⽹论坛样本数据的测试,本站对于动⽹论坛密码的命中率达到83%。

如何保证安全性
下⾯按照措施将密码安全等级划分为5层:
Level0:明⽂也就是不加密
username password
tom 123456
Level1:摘要式⾝份验证
验证流程:
1. 提交⽤户名密码
2. 计算密码哈希值
3. ⽐对存储的哈希值和计算出的哈希值是否相等
相同:登陆成功
不同:登陆失败
使⽤哈希算法(可以是md5, sha1, sha256,sha512 结果长度依次增长):
123456→SHA-512→ba3253876aed6b
username password
tom ba3253876aed6b…
**哈希算法缺点: **
1.容易遭受彩虹表(rainbow table, 如下)攻击!通过把⼤量的哈希值和原密码存储的组合存储在表中。

达到⽤得到的hash值反向查询原密码。

hash_value original_password
ba3253876aed6b (123456)
c70b5dd9ebfb6f… abc123
b109f3bbbc244e… password
… …
2.另外⼀个缺点是可以看到谁有相同的密码
username password
tom ba3253876aed6b…
jerry ba3253876aed6b…
… …
Level2:哈希+salt
学名叫加盐(salt),salt可以简单的理解成:随机产⽣的⼀定长度的,可以和密码相结合,从⽽使hash算法产⽣不同结果的字符串。

123456 + 0x23f22(salt)→SHA-512→bc22711a45e73e5e50f8...
username salt password
tom 0x23f22 bc22711a45e73e5e50f8…
优点:这种⽅法会极⼤防⽌受到彩虹表的攻击,因为即便攻击者构造出彩虹表,因为你使⽤了 hash(密码+ salt),攻击者彩虹表⾥的哈希值(hash(密码))和你数据库中的哈希值是不同的。

缺点:如果攻击者知道了salt和你的哈希值,就可以计算出你的原始密码(当然也没有那么容易)
增强版本:
两次MD5,使⽤⼀个随机字符串salt与密码的md5值再进⾏⼀次md5,使⽤很⼴泛
由于现在的彩虹表⼤部分是针对⼀次md5的,当然可能存在多次md5的彩虹表,那么我们可以多次md5,⼤⼤增加他的存储成本和少量的计算成本
Level3:增加计算的时间(哈希 + salt + Iteration)
通过迭代计算的⽅式增加计算密码的成本。

迭代的周期控制在⽤户可以接受范围内,这样攻击者的计算和时间成本就会⼤⼤增加。

123456 + 0x23f22(salt)→SHA-512 (500000 times)→bc6567567a45e73...
username iteration salt password
tom 500000 0x23f22 bc6567567a45e73…
类似的⽅法可以使⽤: BCript(⽐正常的hash+salt慢10000倍,因此增加了10000倍的破解成本)
hashed value = BCript(password,salt,cost factor)
123456 + 0x23f22(salt) + 10 (cost factor)→BCript→bc6567567a45e73...
username password
tom $2a$10$rocuFOLJQLDDM12XMDJ32
注:
1. ⼀般的应⽤做到LEVEL3就可以了,如果需要更加安全的⽅式请看下⽂。

2. 增加迭代次数会增加⾃⼰的系统的运⾏成本,⽐如说:原来⽤MD5时⼀台服务器解决⽤户登录问题负载刚好100%,你⽤这个该死的
bcrypt算法就需要该死的上万台服务器才能解决问题。

Level4:加密哈希后的密码 Encrypt(BCript的结果或者密码+salt经过hash的结果)
密钥(Encryption key) + BCript的结果→AES 256→ox2c78a32f...
username password
tom ox2c78a32f…
定时更换密钥(准备⼀组密钥定时更换,⾸先通过密钥解密加密存储的密码得到 bscript计算出的hash值,在⽤新的密钥进⾏加密)密钥存储在在不同的数据源
(通过将密钥存储在不同的数据源的⽅法,进⼀步增加了破解难度,因为需要同时获得⽤户密码表数据,同时要获得其他数据源存储的密钥)
Level5:在Level4的基础上,将密码分成若⼲个块,分发到不同的数据库
补充
1.设计⾃⼰的哈希函数。

不要简单地复制粘贴常见开源代码。

这样会增加安全性,别⼈就算获得了你的加密源码,也要重新构造彩虹表。

2.SHA-1,安全哈希算法,对于长度⼩于2^64位的消息,SHA1会产⽣⼀个160位的消息摘要。

该算法的思想是接收⼀段明⽂,然后以⼀种不可逆的⽅式将它转换成⼀段(通常更⼩)密⽂。

加密性强的散列⼀定是不可逆的,这就意味着通过散列结果,⽆法推出任何部分的原始信息。

任何输⼊信息的变化,哪怕仅⼀位,都将导致散列结果的明显变化,这称之为雪崩效应,雪崩效应是我们所希望的。

相⽐MD5,推导过程⽐较相似,因为⼆者均由MD4导出,但是⽐md5长摘要长32 位,更安全,但依然可以⽤彩虹表破解。

3.SHA-224、SHA-256、SHA-384,和SHA-512并称为SHA-2,它们⽣成的摘要密⽂分别就是224,256,384,512位。

虽然SHA-2⽐SHA-1具有更⾼的安全性,但是SHA-2应⽤并不⼴泛,原因是在某些操作系统上缺乏⽀持。

4.MD5+salt对于⼤部分中⼩⽹站来说已经⾜够安全了;
5.不能加固定盐(salt)(不是随机salt,全部设⼀样的值),⼈家连你的密码库都能拿到,盐还不是轻⽽易举的事情么?还有说不知道我的算法是什么,⽼⼤,⼈家能攻破你的系统登进来,把你的整套数据库拿⾛,还差程序不成?告诉你,剩下的问题只是你的库⾥⾯有多少价值⽽已。

⽐如这样的思路:
我已经有你的程序了;
找到⽣成密码散列值的⼊⼝函数Fuck();
拿⼀个明⽂密码库,在⼀个⽤户账号上⾯不停地改密码,也就是⽤每⼀个P不断地Fuck(P);
好了,密码碰撞库就出来了。

⼀些调⽤⽅法:
MD5
import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD5(Message Digest algorithm 5,信息摘要算法)
通常我们不直接使⽤上述MD5加密。

通常将MD5产⽣的字节数组交给BASE64再加密⼀把,得到相应的字符串
Digest:汇编
*/
public class MD5 {
public static final String KEY_MD5 = "MD5";
public static String getResult(String inputStr)
{
System.out.println("=======加密前的数据:"+inputStr);
BigInteger bigInteger=null;
try {
MessageDigest md = MessageDigest.getInstance(KEY_MD5);
byte[] inputData = inputStr.getBytes();
md.update(inputData);
bigInteger = new BigInteger(md.digest());
} catch (Exception e) {e.printStackTrace();}
System.out.println("MD5加密后:" + bigInteger.toString(16));
return bigInteger.toString(16);//返回此 BigInteger 的给定基数16进制的字符串表⽰形式。

}
public static void main(String args[])
{
try {
String inputStr = "简单加密8888888888888888888";
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
SHA
import java.math.BigInteger;
import java.security.MessageDigest;
/*
SHA(Secure Hash Algorithm,安全散列算法),数字签名等密码学应⽤中重要的⼯具,
被⼴泛地应⽤于电⼦商务等信息安全领域。

虽然,SHA与MD5通过碰撞法都被破解了,
但是SHA仍然是公认的安全加密算法,较之MD5更为安全*/
public class SHA {
public static final String KEY_SHA = "SHA";
public static String getResult(String inputStr)
{
BigInteger sha =null;
System.out.println("=======加密前的数据:"+inputStr);
byte[] inputData = inputStr.getBytes();
try {
MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA);
messageDigest.update(inputData);
sha = new BigInteger(messageDigest.digest());
System.out.println("SHA加密后:" + sha.toString(32));
} catch (Exception e) {e.printStackTrace();}
return sha.toString(32);
}
public static void main(String args[])
{
try {
String inputStr = "简单加密";
getResult(inputStr);
} catch (Exception e) {
e.printStackTrace();
}
}
}
⼀种常见的对称加密算法--DES
⽬前在国内,随着三⾦⼯程尤其是⾦卡⼯程的启动,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、⾼速公路收费站等领域被⼴泛应⽤,以此来实现关键数据的保密,如信⽤卡持卡⼈的PIN的加密传输,IC卡与POS间的双向认证、⾦融交易数据包的MAC校验等,均⽤到DES算法。

DES算法的⼊⼝参数有三个:Key、Data、Mode。

其中Key为8个字节共64位,是DES算法的⼯作密钥;Data也为8个字节64位,是要被加密或被解密的数据;Mode为DES的⼯作⽅式,有两种:加密或解密。

 DES算法是这样⼯作的:如Mode为加密,则⽤Key 去把数据Data进⾏加密,⽣成Data的密码形式(64位)作为DES的输出结果;如Mode为解密,则⽤Key去把密码形式的数据Data解密,还原为Data的明码形式(64位)作为DES的输出结果。

在通信⽹络的两端,双⽅约定⼀致的Key,在通信的源点⽤Key对核⼼数据进⾏DES加密,然后以密码形式在公共通信⽹(如电话⽹)中传输到通信⽹络的终点,数据到达⽬的地后,⽤同样的Key对密码数据进⾏解密,便再现了明码形式的核⼼数据。

这样,便保证了核⼼数据(如PIN、MAC等)在公共通信⽹中传输的安全性和可靠性。

通过定期在通信⽹络的源端和⽬的端同时改⽤新的Key,便能更进⼀步提⾼数据的保密性,这正是现在⾦融交易⽹络的流⾏做法。

 DES算法具有极⾼安全性,到⽬前为⽌,除了⽤穷举搜索法对DES算法进⾏攻击外,还没有发现更有效的办法。

相关文档
最新文档