数字签名更多是用来校验信息有没有被修改过,而加密可以彻底杜绝防止别人看到信息内容
SHA-1 和 MD5算法
严格说来它们不算是加密算法,只能说是摘要算法。
SHA-1算法:Security Hash Algorithm 安全哈希算法, 它可以把长度不超过2的64次方位的信息转换成160位(20字节)长的散列值
MD5算法:Message Digest 信息摘要算法, 散列长度是128位,16个字节。它对输入以512位分组,输出是4个32位字的级联。
CRC算法:循环冗余校验,碰撞几率比较高
加密技术可以分为对称与非对称两种.
对称加密,解密,即加密与解密用的是同一把秘钥,常用的对称加密技术有DES,AES等
而非对称技术,加密与解密用的是不同的秘钥,常用的非对称加密技术有RSA等
例如DES对称加密代码:
/**
* 给用户id和设备id进行加密,添加时间属性 *
* @param userId
* @return
*/
public static String encode(Long userId, Long deviceId) {
try {
Random random = new Random();
StringBuilder sb = new StringBuilder();
for (int i = 0; i < 16; i++) {
sb.append(values[random.nextInt(values.length - 1)]);
}
String randomCode = sb.toString();
SecretKey deskey = new SecretKeySpec((randomCode + KEYPREFIX).getBytes("utf-8"), "DESede"); // 加密
Cipher c1 = Cipher.getInstance("DESede");
c1.init(Cipher.ENCRYPT_MODE, deskey);
String str = "";
String time=new SimpleDateFormat("yyyyMM").format(new Date());
if (deviceId != null && deviceId > 0) {
str = Tf8Base64.base32Encode(c1.doFinal(String.valueOf(userId + SEP + deviceId+SEP+Long.valueOf(time)).getBytes("utf-8")));
} else {
str = Tf8Base64.base32Encode(c1.doFinal(String.valueOf(userId).getBytes("utf-8")));
}
return URLEncoder.encode(UNDERLINE + str + randomCode, "utf-8");
} catch (Exception e) {
log.error("error happens when encode userId for " + userId + ",error info is " + e.getMessage(), e);
}
return "";
}
DES 解密
/**
* @param code
* @return
*/
public static String decode(String code) {
try {
code = URLDecoder.decode(code, "utf-8");
String userId = code.substring(0, code.length() - 16);
String randomCode = code.substring(code.length() - 16);
SecretKey deskey = new SecretKeySpec((randomCode + KEYPREFIX).getBytes("utf-8"), "DESede"); // 解密
Cipher c1 = Cipher.getInstance("DESede");
c1.init(Cipher.DECRYPT_MODE, deskey);
return new String(c1.doFinal(Tf8Base64.base32Decode(userId)));
} catch (Exception e) {
log.error("error happens when decode code for " + code + ",error info is " + e.getMessage(), e);
}
return "";
}