日期:2014-05-17  浏览次数:20714 次

下面JAVA代码是不是用MD5对数据库SQL SERVER用户密码加密的?帮忙详细注释每一行代码。
package com.util;

import java.security.*; 
import java.security.spec.*; 
public final class MD5 {

public final static String MD5(String s){ 
char hexDigits[] = { 
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 
'e', 'f'}; 
try { 
byte[] strTemp = s.getBytes(); 
MessageDigest mdTemp = MessageDigest.getInstance("MD5"); 
mdTemp.update(strTemp); 
byte[] md = mdTemp.digest(); 
int j = md.length; 
char str[] = new char[j * 2]; 
int k = 0; 
for (int i = 0; i < j; i++) { 
byte byte0 = md[i]; 
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
str[k++] = hexDigits[byte0 & 0xf]; 

return new String(str); 

catch (Exception e){ 
return null; 

}
}

------最佳解决方案--------------------
有些楼上的哥们都说了,加上我的吧
byte byte0 = md[i]; //获取经过md5取数据摘要后的每一位,然后用一定的规则对其进行编码,防止出现乱码;
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
因为你这里的码表是16位的即16个二进制位,(0,1,2,。。。f)
一个字节是八位的,右移四位并且与上15表示取最高四位;比如
byte0=10010110 右移四位变成1001 ,然后再与上15即00001111;最后的结果是1001
也就是byte0的前四位;为什么是四位呢?因为你的码表中有16个字符,从0-15刚好表示的完,而不会
造成数组下标越界;取前四位的值做为新数组的角标;这里是9表示你取到的是你编码中的9;
同理str[k++] = hexDigits[byte0 & 0xf]; 这个是取最低四位的!作为新数组的角标;
这里取到的是0110,即5,对应编码表中的就是5,依次类推;
那么str[k++];也就是该数组中的内容是间隔的取角标对应的数据;
说这么多表达的就是一个意思,你给我传来的数据,我会按照一定的规律(至于这个规律看作者的喜好);组织,但是给你看到的字符,也就是加密后的字符一定是0 1 2.。。f这些组成的,除此之外不可能有任何字符,这就解决了加密出现乱码问题;
我也就只能说到这了,再不懂就自己多百度谷歌下吧!了解Base64算法和md5编码,会用就可以了,这里的只是加密思想的另一种体现形式,其思想实质都是一样的!


------其他解决方案--------------------
这个具体的原理还是去看看md编码的算法把!
一般我们开发对数据库中的数据要加密(准确的说是去数据摘要产生128位字节码);
这个时侯返回的值是一个byte数组;
但是这个byte数组不能直接toString,来返回一个字符串,因为在toString过程中会去查码表,默认的是
8859-1,就会导致乱码;
这个时候我们会采用Base64编码,取出来的数据就是正确的可见字符;用代码实现就是
String password="message";
MessageDigstet md=MessageDigest.getInstance("MD5"); 
byte[] buf=md.digstet(password.getBytes());
Base64Encoder encoder=new Base64Encoder();
password=encoder.encode(buf);
具体的思想就是这样的;你上面的
int j = md.length; 
char str[] = new char[j * 2]; 
int k = 0; 
for (int i = 0; i < j; i++) { 
byte byte0 = md[i]; 
str[k++] = hexDigits[byte0 >>> 4 & 0xf]; 
str[k++] = hexDigits[byte0 & 0xf]; 
这些都可以视为Base64编码过后的结果,只不过你的编码表是自定义的
char hexDigits[] = { 
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 
'e', 'f'}; 
而Base64编码采用的是26个字母,大小写26*2=52个,加上0-9  10个
+ /就是64个了
希望对你有帮助!
------其他解决方案--------------------
好吧,其实我也不懂,不过我可以用猜的

package com.util;

import java.security.*; 
import java.s