我是一个喜欢干货的程序员,目前主要从事Android开发,偶尔会。喜欢在实践中去理解和学习新的知识!
项目开发中我们经常会用到登录注册等功能。用户注册的数据在传输过程中如何的到保证呢。特别是用户名和密码
常用的方式是MD5加密后直接post传递到服务器。
但是自从MD5被山东大学王小云教授成功破解后,貌似也不太安全了。
我们的项目中使用的是DES加密。DES加密是需要秘钥的,保护好秘钥加密的文件才安全。
秘钥的获取是用的MD5加密一个固定的字符串后取前八位得到的。因为DES加密的秘钥的位数必须是8的倍数。
下面附上MD5加密算法和DES加密算法
MD5加密
public static String string2MD5(String inStr){
/***
* MD5加密 生成32位大写的md5码
*/
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];
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++){
int val = ((int) md5Bytes[i]) & 0xff;
if (val < 16)
hexValue.append("0");
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString().toUpperCase();
}
DES加密:
package com.anbaoyue.manyiwang.utils;
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import javax.crypto.spec.IvParameterSpec;
public class DES_Utils {
//对用户的 密码进行加密,DES加密需要密钥(密钥位数必须是8的倍数),使用要对文件加密,所以密钥必须保护好。密钥的获取这里是:字符串进行MD5 32位大写加密取前8位得到的
private static byte[] desKey;
private static String key = ((String) MD5Util.string2MD5("nihao@abc%def").subSequence(0, 8));
public static String decrypt(String message) throws Exception {
byte[] bytesrc = convertHexString(message);
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
cipher.init(Cipher.DECRYPT_MODE, secretKey, iv);
byte[] retByte = cipher.doFinal(bytesrc);
return new String(retByte);
}
public static byte[] encrypt(String message) throws Exception {
Cipher cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
DESKeySpec desKeySpec = new DESKeySpec(key.getBytes("UTF-8"));
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKeySpec);
IvParameterSpec iv = new IvParameterSpec(key.getBytes("UTF-8"));
cipher.init(Cipher.ENCRYPT_MODE, secretKey, iv);
return cipher.doFinal(message.getBytes("UTF-8"));
}
public static byte[] convertHexString(String ss) {
byte digest[] = new byte[ss.length() / 2];
for (int i = 0; i < digest.length; i++) {
String byteString = ss.substring(2 * i, 2 * i + 2);
int byteValue = Integer.parseInt(byteString, 16);
digest[i] = (byte) byteValue;
}
return digest;
}
//调用下面的方法就可以实现加密了,返回加密后的密文
public static String toHexString(byte b[]) {
StringBuffer hexString = new StringBuffer();
for (int i = 0; i < b.length; i++) {
String plainText = Integer.toHexString(0xff & b[i]);
if (plainText.length() < 2)
plainText = "0" + plainText;
hexString.append(plainText);
}
return hexString.toString().toUpperCase();//这里我返回的是大写的;
}
}