一、密码存储数据库的安全问题
在实际应用中,一般不会直接在数据库中以明文的方式来保存用户的密码,因为这样很容易造成密码的泄露。所以需要将密码进行加密后以密文的方式进行保存,另外一种更有效的办法是只保存密码的MD5摘要,因为相同的两个字符串MD5值也相同,在登录时就可以根据密码的MD5摘要和数据库中存放的MD5值摘要进行比较来确定用户输入的密码是否正确。同时,由于获取到了MD5摘要后不能反推出原来的密码明文(这是由于MD5算法是一种不可逆的加密算法),即使内部人员可以查看用户信息表也无法知道用户的密码的明文。所以,MD5摘要存储用户的密码或者重要信息字段已经成为大多数应用系统的通用方式。
二、MD5完全安全吗?
如果将加密的md5值直接保存在数据库,当网站存在注入或者其它漏洞时,入侵者极有可能获取用户的密码值,通过md5在线查询或者暴力破解可以得到密码。
所以,目前大多数Web应用都是用了图片输入验证码的功能,这时因为图片上显示的验证码是随机生成的,验证码也是一次性的。每次登录都不同,这样使得工具暴力破解也无用武之地。
三、MD5算法
MD5算法:Message-Digest Algorithm 5(信息-摘要算法).它的作用是让大容量信息在用数字签名软件签署私人密匙前被"压缩"成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数)。它需要获得一个随机长度的信息并产生一个128位的信息摘要。
MD5加密算法的实现步骤:
1、MD5算法对输入的数据进行补位,使得如果数据长度Len,有Len%512==448。即Len==K*512+448位,即K*64+56字节。(K是任意整数)。具体补位操作:先补一个1,其余补0至满足要求。
2、补数据长度:用一个64位的数字表示原始长度B,把B用两个32位数表示。这时,数据就被填补成长度为512位的倍数。
3、初始化MD5参数。四个32位整数(A,B,C,D)用来计算信息摘要,初始化使用的是十六进制表示的数字
A=0X01234567
B=0X89abcdef
C=0Xfedcba98
D=0X76543210
A,C,C,D为链接变量.
4、处理位操作函数
X、Y、Z为32位整数
以下是每次操作中用到的四个非线性函数(每轮一个)。
F(X,Y,Z) =(X&Y)|((~X)&Z)
G(X,Y,Z) =(X&Z)|(Y&(~Z))
H(X,Y,Z) =X^Y^Z
I(X,Y,Z)=Y^(X|(~Z))
(&是与,|是或,~是非,^是异或)
这四个函数的说明:如果X、Y和Z的对应位是独立和均匀的,那么结果的每一位也应是独立和均匀的。F是一个逐位运算的函数。即,如果X,那么Y,否则Z。函数H是逐位奇偶操作符。
5、算法的四轮循环运算。循环的次数是信息中512位信息分组的数目。
将上面四个链接变量复制到另外四个变量中:A到a,B到b,C到c,D到d。
主循环有四轮,每轮循环都很相似。第一轮进行16次操作。每次操作对a、b、c和d中的其中三个作一次非线性函数运算,然后将所得结果加上第四个变量,文本的一个子分组和一个常数。再将所得结果向右环移一个不定的数,并加上a、b、c或d中之一。最后用该结果取代a、b、c或d中之一。
主要变换过程:
使用常数组T[1......64].T[i]为32位整数用6进制表示.数据用16个32位的整数数组M[]表示.
具体过程如下:
/*处理数据原文*/
For i = 0 to N /16-1 DO
/*每一次 把数据原文存在16个元素的数组X中。*/
For i=0 to 15 do
set X[i] to M[i*16+J]
END /结束对J的循环
/* SAVE A AS AA,B AS BB,C AS CC,AND D AS DD。*/
AA=A
BB=B
CC=C
DD=D
/*第1轮*/
/* 以[ABCD K S I]表示如下操作
A=B+((a+F(b,c,d)+X[k]+T[i])<<<s).*/
/* do the following 16 operations.*/
[abcd 0 7 1][dabc 1 12 2][CDAB 2 17 3][BCDA 3 22 4]
[abcd 4 7 5][dabc 5 12 6][CDAB 6 17 7][BCDA 7 22 8]
[ABCD 8 7 9][DABC 9 12 10][CDAB 10 17 11][BCDA 11 22 12]
[ABCD 12 7 13][DABC 13 12 14][[CDAB 14 17 15][BCDA 15 22 16]
/*第2轮****/
/* 以[ABCD K S I]表示如下操作
A =B+(((A+G(B,C,D)+[K]+t[i]<<<S).*/
/* do THE FOLLWING 16 OPERATIONS.*/
[abcd 1 5 17][DABc 6 9 18[cdab 11 14 19][bcda 0 20 20]
[abcd 5 5 21][dabc 10 9 22][CDAB 15 14 23][BCDA 4 20 24]
[ABCD 9 5 25][DABC 14 9 26][CDAB3 14 27][BCDA 4 20 24]
[ABCD 13 5 29][DABC 2 9 30][CDAB 7 14 31][BCDA 12 20 32]
第3轮*/
/*[ABCD K S I] A=B+((A+h(B,C,D)x[K]+T[I]<<<S)
[abcd 5 4 33][dabc 8 11 34][cdab 11 16 35][bcda 14 23 36]
[abcd 1 4 37][dabc 4 11 38][cdab 7 16 39][bcda 10 23 40]
[abcd 13 4 41][dabc 0 11 42][cdab 3 16 43][bcda 6 23 44]
[avcd 9 4 45][dabc 12 11 46][cdab 15 16 47][bcda 2 25 48]
第4轮*/
A=A+AA
B=B+BB
C=C+CC
D=D+DD
END
结束对i的循环,加密就结束了。输出的结果就是我们看不清楚的16位加密MD5密文了。