gotea 2015-04-22
数字签名更多是用来校验信息有没有被修改过,而加密可以彻底杜绝防止别人看到信息内容
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 ""; }