提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
最近项目中需要保存用户数据,但是由于数据中不能进行明文保存,需要进行加密保存,所以针对加解密进行一些调研和学习。
信息一般都具有一定的隐私性和排他性,需要防止被第三方或者非授权方获取。但信息从发送方到接受方可能会经过很多中间流程。除非发送方直接将信息直接告知接受方,否则在传递过程中信息存在被第三方获知的可能性。因此为了防止信息被窃取因此在传递和存储信息的时候需要对信息进行加密处理,将信息从明文转换成密文。
信息以密文的形式被接收方获得后,如果接受方想要获知信息内容则需要进行解密操作。
比如谍战片中常见的以无线电传递信息,发送方先加情报进行加密,接收方收到无线电后进行解密操作才可以得知情报,第三方虽然可以接收到发送方的加密情报,但是由于不知道如果解密所以不知道情报内容。通过加解密实现了通过不安全的无线电方式,将情报从发送方传递到接收方,并且防止第三方对情报内容的窃取。
加解密算法分了不可逆加密和可逆加密:
不可逆加密:即单向加密,明文生成密文后无法解析出明文;主要用于密钥和口令加密,单相加密算法有:MD5和SHA系列、HMAC;
可逆加密:即双向加密,明文生成密文后可以解析出明文;双向加密中如果加解密使用同一密钥为对称性加密,加解密使用不同密钥为非对称加密。
MD5信息摘要算法(MD5 Message-Digest Algorithm)是一种密码散列函数,对原始消息进行处理生成一个固定长度的消息摘要(密文),所以MD5算法是一个单向加密算法。
代码如下(示例):
import org.springframework.util.DigestUtils;
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Secret {
public static void main(String[] args) {
String soure=" this is a test source string";
byte[] secretBytes = null;
try {
// 使用jdk自带的MessageDigest
secretBytes = MessageDigest.getInstance("md5").digest(soure.getBytes(StandardCharsets.UTF_8));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String md5code = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - md5code.length(); i++) {
md5code = "0" + md5code;
}
System.out.println(md5code);
// 使用spring的DigestUtils
System.out.println(DigestUtils.md5DigestAsHex(soure.getBytes()));
}
}
SHA-1/SHA-256 安全散列算法(Secure Hash Algorithm)是一个密码散列算法,能计算出一个信息所丢赢的长度固定的字符串。在安全协议中被广泛使用,包括TLS和SSL、PGP、SSH等,SHA-1安全性已经受到挑战,普遍使用SHA-256。
代码如下(示例):
import java.math.BigInteger;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class Secret {
public static void main(String[] args) {
String soure=" this is a test source string a word is peace";
byte[] secretBytes = null;
try {
// 使用jdk自带的MessageDigest
secretBytes = MessageDigest.getInstance("SHA-1").digest(soure.getBytes(StandardCharsets.UTF_8));
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
String shaCode = new BigInteger(1, secretBytes).toString(16);
for (int i = 0; i < 32 - shaCode.length(); i++) {
shaCode = "0" + shaCode;
}
System.out.println(shaCode);
}
}
HAMC密钥相关的哈希运算消息认证码(Hash-based Message Authentication Code),是基于Hash函数和密钥进行消息认证的方法。相当于使用散列函数对消息进行操作后,又用发送方和接收方共享的认证的密钥进行再次操作。HMAC不仅能对消息完整性进行认证,还可以对发送方身份进行认证。
单向加密算法主要双方通过算法将消息计算成固定长度的摘要,通过摘要的对比来验证消息的一致性,HMAC通过引入密钥又解决了对消息来源方的身份认证问题。