深入理解加密解密
一、概述
在开发项目中我们必然会涉及到加密解密,我们常需要用到加解密算法,加解密算法主要分为三大类:
1、对称加密算法,如:AES、DES、3DES
2、非对称加密算法,如:RSA、DSA、ECC
3、散列算法,如:MD5、SHA1、HMAC
接下来对它们各自的算法和在项目中的应用进行具体分析。
二、各算法对比
对称加密算法(加解密密钥相同)
非对称算法(加密密钥和解密密钥不同)
散列算法比较
对称与非对称算法比较
注:密钥是一种参数,它是在明文转换为密文或将密文转换为明文的算法中输入的参数
三、项目中常用总结
对称加密: DES(56位),
非对称加密: ECC(160位)或RSA(1024),
消息摘要: MD5
数字签名:DSA
其中,AES和MD5最为常用,
四、应用案例
4.1、DES应用之用户ID加解密
背景介绍
有时候我们不希望直接把ID暴露给用户,因为有规则的ID,容易泄露信息,同时有可能被第三方直接遍历抓取资源。为了防止数据库条目 ID 直接暴露给用户,需要对ID进行按照自己的规则加密。
加解密核心代码
加密:
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(dks);
cipher = Cipher.getInstance(desMode);
cipher.init(Cipher.ENCRYPT_MODE, securekey, spec);
解密:
dks =new DESKeySpec(key);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey securekey = keyFactory.generateSecret(dks);
cipher = Cipher.getInstance(desMode);
cipher.init(Cipher.DECRYPT_MODE, securekey, spec);
4.2、RSA之密码明文传输
背景介绍:
当用户设置或者更改密码时,通过输入的密码在页面的表单数据中显示为明文,这样可能会窃取,产生安全风险。因此需要采用一定的规则对其进行密文显示。
RSA和核心代码
前端:引入jsencrypt.jsp进行加密运算。
后端:通过RSAUtils里面的解密方法进行解密。
4.3、MD5之签名加密
背景介绍
系统从外部获取数据时,通常采用API接口调用的方式来实现。请求方和接口提供方之间的通信过程,有这几个问题需要考虑:
1)、请求参数是否被篡改;
2)、请求来源是否合法;
3)、请求是否具有唯一性。
为了保证请求来源的合法性,需要求调用方按照约定好的算法生成签名字符串,作为请求的一部分,接口提供方验算签名即可知是否合法。
MD5签名加密核心代码
public static String getEncryptionUtf8(String originString)
throws UnsupportedEncodingException {
String result ="";
if (originString !=null) {
try {
// 指定加密的方式为MD5
MessageDigest md = MessageDigest.getInstance("MD5");
md.update((originString).getBytes("UTF-8"));
byte b[] = md.digest();
// 进行加密运算
int i;
StringBuffer buf =new StringBuffer("");
for(int offset=0; offset
i = b[offset];
if(i<0){
i+=256;
}
if(i<16){
buf.append("0");
}
buf.append(Integer.toHexString(i));
}
result = buf.toString();
}catch (NoSuchAlgorithmException e) {
//e.printStackTrace();
}
}
return result;
}