数据加密的目的
保密性:防止用户的标识或数据被读取,例如对用户密码进行哈希加密。
身份验证:确保数据发自特定的一方,例如数字签名验证
数据完整性:防止数据被更改,例如使用哈希函数对比收发双发消息的哈希值是否相同来判断消息是否被更改
加密算法的分类
1、对称加密
采用对称秘钥的加密系统加密、解密过程均采用同一把秘钥,通信双方必须同时获得这把钥匙进行加密解密操作。
常见对称加密:AES\DES\3DES
特点:对称加密算法的特点是算法公开、计算量小、加密速度快、加密效率高。
不足之处:甲方必须把加密规则告诉乙方,否则无法解密。
2、非对称加密
非对称加密系统采用的加密解密秘钥是不同的,公钥加密私钥解密、私钥加密公钥解密
常见的非对称算法:RSA\DSA\ECC
特点:非对称加密算法的保密性比较好,它消除了最终用户交换密钥的需要,但加密和解密花费时间长、速度慢,它不适合于对文件加密而只适用于对少量数据进行加密
3、哈希函数加密算法
无需借助任何秘钥,主要用于针对前两者加密过程中需要保护的部分提供完整性、防伪造的支持。
常见的哈希加密算法:MD5,SHA-256,SHA-1,SHA-2,SHA-X(系列)
特点:是一种单向密码体制,即只有加密过程,没有解密过程,因此单向不可逆
对三类算法中的代表介绍
1、AES算法(对称性算法)
在AES算法之前,内广泛采用的是DES算法,但是由于DES密钥长度较小,只有56位,导致数据安全性不高,因此就诞生出了AES算法,该算法支持128位、256位的密钥,因此数据安全性更高(这也得借助它的实现原理,稍显复杂不做讲解)。
JAVA代码实现:
public class AESCodec {
//密钥算法
public static final String KEY_ALGORITHM = "AES";
//加解密算法/工作模式/填充方式,Java6.0支持PKCS5Padding填充方式,BouncyCastle支持PKCS7Padding填充方式
public static final String CIPHER_ALGORITHM = "AES/ECB/PKCS5Padding";
/**
* 生成密钥
* @throws NoSuchAlgorithmException
*/
public static String initkey() throws NoSuchAlgorithmException{
KeyGenerator kg = KeyGenerator.getInstance(KEY_ALGORITHM); //实例化密钥生成器
kg.init(128); //初始化密钥生成器:AES要求密钥长度为128,192,256位
SecretKey secretKey = kg.generateKey(); //生成密钥
return Base64.encodeBase64String(secretKey.getEncoded()); //获取二进制密钥编码形式
}
/**
* 转换密钥
*/
public static Key toKey(byte[] key){
return new SecretKeySpec(key, KEY_ALGORITHM);
}
/**
* 加密数据
* @param data 待加密数据
* @param key 密钥
* @return 加密后的数据
* */
public static String encrypt(String data, String key){
try {
Key k = toKey(Base64.decodeBase64(key)); //还原密钥
//使用PKCS7Padding填充方式,这里就得这么写了(即调用BouncyCastle组件实现)
//Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM, "BC");
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM); //实例化Cipher对象,它用于完成实际的加密操作
cipher.init(Cipher.ENCRYPT_MODE, k); //初始化Cipher对象,设置为加密模式
return Base64.encodeBase64String(cipher.doFinal(data.getBytes())); //执行加密操作。加密后的结果通常都会用Base64编码进行传输
} catch (Exception e) {
return "";
}
}
/**
* 解密数据
* @param data 待解密数据
* @param key 密钥
* @return 解密后的数据
* */
public static String decrypt(String data, String key){
Key k = toKey(Base64.decodeBase64(key));
try {
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
cipher.init(Cipher.DECRYPT_MODE, k); //初始化Cipher对象,设置为解密模式
return new String(cipher.doFinal(Base64.decodeBase64(data))); //执行解密操作
} catch (NoSuchAlgorithmException | IllegalBlockSizeException | BadPaddingException | InvalidKeyException | NoSuchPaddingException e) {
return "";
}
}
public static void main(String[] args) throws Exception {
String source = "";
System.out.println("原文:" + source);
// String key = initkey();
String key=GlobalConstant.AESKEY;
System.out.println("密钥:" + key);
String encryptData = encrypt(source, key);
System.out.println("加密:" + encryptData);
String decryptData = decrypt("f4MSFRQ6LobAqyYuwvZ7Tw===", key);
System.out.println("解密: " + decryptData);
}
}
2、SHA-系列算法(哈希函数算法)
SHA衍生出来的算法有很多,例如SHA-1,SHA-2、SHA-256,该
算法系列也是经过时间的考量的,是当前较为主流的一套非对称加密算法
题外话:SHA-1算法曾被我国的一名教授发现漏洞
JAVA代码实现:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created by 罗浩 on 2017/9/16.
*/
public class SHACode {
public static String encrypt(String data) {
MessageDigest sha = null;
try {
sha = MessageDigest.getInstance("SHA");
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
byte[] byteArray = data.getBytes();
byte[] shaBytes = sha.digest(byteArray);
StringBuffer hexValue = new StringBuffer();
for (int i = 0; i < shaBytes.length; i++) {
int val = ((int) shaBytes[i]) & 0xff;
if (val < 16) {
hexValue.append("0");
}
hexValue.append(Integer.toHexString(val));
}
return hexValue.toString();
}
}
3、MD5算法(哈希函数算法)
MD5算法是是把一个任意长度的字节串变换成一定长的十六进制数字串
JAVA实现代码与SHA算法相似,只需将MessageDigest.getInstance(“SHA”);中的SHA改为MD5即可
ps:由于MD5摘要更短,所以更易受到攻击,但相反地,它在生成速度上面就更快,因为要处理的东西更少。
对于RSA算法,详情可参考:http://www.jianshu.com/p/316ce9fa083
本文介绍了数据加密的目的,包括保密性、身份验证和数据完整性,并详细解释了对称加密、非对称加密及哈希函数三种主要加密算法的特点及应用场景。通过具体示例,如AES、SHA系列和MD5算法,展示了不同加密技术的Java实现。
1925

被折叠的 条评论
为什么被折叠?



