在工作中有时会用到把密码MD5加密后放入数据库的情况,
咱们现在就来说说如何MD5加密。
先说说代码,
public static String string2MD5(String inStr){
MessageDigest md5 = null;
try{
md5 = MessageDigest.getInstance("MD5");
}catch (Exception e){
System.out.println(e.toString());
e.printStackTrace();
return "";
}
char[] charArray = inStr.toCharArray();
byte[] byteArray = new byte[charArray.length];
//问题一如果加密的字符串是个带汉字的占两个字节,此时成char转成byte 必定要溢出掉一些数据,
但是经过测试,字符串也可再解密成原来的汉字
for (int i = 0; i < charArray.length; i++)
byteArray[i] = (byte) charArray[i];
byte[] md5Bytes = md5.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < md5Bytes.length; i++){
//由于byte8位变为int类型,要进行补位,加入补码 此时与 0xff做与运算,高位被全部清0
int val = ((int) md5Bytes[i]) & 0xff;
//由于byte可以转化为2位的16进制数,当他小于16时,此时只占一位,为了保持统一两个,高位补0
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
//问题二,代码很容易理解,算法弄不明白。
public static String convertMD5(String inStr){
char[] a = inStr.toCharArray();
for (int i = 0; i < a.length; i++){
a[i] = (char) (a[i] ^ 'a');
}
String s = new String(a);
return s;
}
//测试
public static void main(String args[]) {
String s = new String("aaa);
System.out.println("原始:" + s);
System.out.println(s.toCharArray().length);
System.out.println(s.getBytes().length);
System.out.println("MD5后:" + string2MD5(s));
System.out.println("加密的:" + convertMD5(s));
System.out.println("解密的:" + convertMD5(convertMD5(s)));
}
再介绍下原码,反码,补码知识。
1>补码的设计目的是:
⑴ 使符号位能与有效值部分一起参加运算,从而简化运算规则。补码机器数中的符号位,并不是强加上去的,是数据本身的自然组成部分,可以正常地参与运算。
⑵ 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计。
2>反码是原码与补码转换的一个中间过渡,使用较少。
3>所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、c等其他高级语言中使用的都是原码。