网站首页 > java教程 正文
在很多Web应用场景中,如何保证数据完整性和安全性是至关重要的,尤其是在数据传输的过程中,如何确保数据是否被修改是保护用户隐私防止用户数据泄露的关键性操作之一,在Spring Boot中我们可以通过多种的加密算法来实现数据完整性的校验操作,其中比较常用的就是哈希算法和数字签名算法,下面我们就来详细介绍一下这些加密算法是如何实现判断数据是否被修改的。
所谓的数据完整性就是指在数据传输、存储的过程中,是否存在数据被修改或者是被损坏的情况,而加密算法则是提供了一套验证数据是否被修改的算法。其中比较常用的算法有如下几种。
- 哈希算法(Hashing)
- 数字签名(Digital Signatures)
- 消息认证码(MACs)
而在Spring Boot中,我们一般通过哈希算法和数字签名算法来实现上面的操作。
哈希算法
通过哈希算法我们可以将任意长度的输入数据映射成指定固定长度的输出数据,如果数据的输入发生了变化,那么哈希值也将会发生非常明显的变化。所以在某些场景中,通过哈希算法可以有效的判断数据是否被修改了。
在Spring Boot中常见的哈希算法有如下一些。
- MD5(Message Digest Algorithm 5)
- SHA-1(Secure Hash Algorithm 1)
- SHA-256(Secure Hash Algorithm 256)
- SHA-512(Secure Hash Algorithm 512)
其中,SHA-256和SHA-512相对更为安全,因为它们比MD5和SHA-1更不容易发生碰撞攻击即不同数据产生相同的哈希值。
实现步骤
假设有一个输入数据例如是一个手机号,我们可以通过哈希算法来生成对应手机号的哈希值,然后将哈希值存储到数据库或者是缓存中,当我们需要验证数据是否发生变化的时候,我们可以对数据进行再次哈希运算,然后去判断得到的哈希值,如果哈希值是一致的,那么就说明数据没有发生变化,否则就说明数据被修改了,如下所示。
在Spring Boot中,我们可以使用MessageDigest类来实现哈希操作。例如,使用SHA-256哈希算法。
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class HashUtil {
public static String hashWithSHA256(String input) throws NoSuchAlgorithmException {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hashBytes = digest.digest(input.getBytes());
StringBuilder hexString = new StringBuilder();
for (byte b : hashBytes) {
hexString.append(String.format("%02x", b));
}
return hexString.toString();
}
}
通过上面的方式,我们可以对任意的字符串进行SHA-256哈希计算,得到一个固定长度的哈希值,然后我们可以将该哈希值存储在数据库中,在需要时再次计算并对比哈希值来验证数据是否被修改。
数字签名
数字签名算法是一种基于公钥的加密算法,用来确保数据的完整性以及进行身份验证操作,通过数字签名算法不仅可以判断数据是否发生的变化,还可以校验数据的来源是否发生了变化。
数字签名算法的基本实现过程如下所示。
- 数据哈希:首先,使用哈希算法计算数据的哈希值。
- 加密哈希值:使用发送方的私钥对哈希值进行加密,生成数字签名。
- 数据传输:发送方将数据和数字签名一起发送给接收方。
- 验证签名:接收方使用发送方的公钥解密数字签名,得到原始的哈希值,并与接收到的数据计算出的哈希值进行比对。如果一致,则数据未被篡改,且来自合法的发送方。
实现步骤
在Spring Boot中我们可以通过Java提供的Signature类来实现数字签名的生成以及验证操作,如下所示。
import java.security.*;
import javax.crypto.Cipher;
import java.util.Base64;
public class DigitalSignatureUtil {
// 生成公钥私钥对
public static KeyPair generateKeyPair() throws NoSuchAlgorithmException {
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
keyPairGenerator.initialize(2048);
return keyPairGenerator.generateKeyPair();
}
// 生成数字签名
public static String sign(String data, PrivateKey privateKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
signature.update(data.getBytes());
byte[] signedData = signature.sign();
return Base64.getEncoder().encodeToString(signedData);
}
// 验证数字签名
public static boolean verify(String data, String signatureStr, PublicKey publicKey) throws Exception {
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initVerify(publicKey);
signature.update(data.getBytes());
byte[] signatureBytes = Base64.getDecoder().decode(signatureStr);
return signature.verify(signatureBytes);
}
}
这种方式的优点就在于不仅能判断数据是否被篡改,还能确保数据来源是否合法。
消息认证码(MAC)
消息认证码(MAC,Message Authentication Code)是一种类似于数字签名的算法,也是用来校验数据的完整性以及消息来源的合法性的技术手段,但是与数字签名算法不一样的是,MAC依赖于共享密钥来生成和验证,也就是说它通常在客户端和服务器之间共享一个密钥,然后用该密钥加密数据的哈希值,生成MAC。
MAC的验证过程类似于哈希,但需要共享密钥才能验证。常见的MAC算法包括HMAC(基于哈希的消息认证码)等。
在Spring Boot中使用HMAC
Spring Boot可以通过javax.crypto包中的Mac类来实现HMAC,如下所示通过HMAC-SHA256算法来实现。
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.util.Base64;
public class HmacUtil {
public static String generateHmacSHA256(String data, String secret) throws Exception {
Mac mac = Mac.getInstance("HmacSHA256");
SecretKeySpec secretKey = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
mac.init(secretKey);
byte[] hmac = mac.doFinal(data.getBytes());
return Base64.getEncoder().encodeToString(hmac);
}
}
通过generateHmacSHA256()方法来生成HMAC用于验证数据完整性。当客户端和服务器共享密钥时,双方可以使用相同的密钥来计算并验证HMAC,确保数据在传输过程中未被篡改。
总结
上面我们介绍了三种在Spring Boot中判断数据是否被修改了的方法,我们可以根据应用场景的不同,选择合适的算法。例如,如果是单纯的数据完整性验证,哈希算法和MAC非常适合;而如果需要同时验证数据的完整性和来源,数字签名则是更为安全的选择。
猜你喜欢
- 2024-12-27 用了这么久的PageHelper,你知道原生的分页查询原理和步骤吗?
- 2024-12-27 美团面试:String s=new String("111"
- 2024-12-27 java基础——字符与字节的区别 java字节型和字符型数据有何区别
- 2024-12-27 最懂初学者的java教程,详细到每个字符的讲解,小白必看
- 2024-12-27 Java之String对象深入理解 java的string
- 2024-12-27 JAVA常见异常 java常见异常类型
- 2024-12-27 Java常见类型数据及其包装类-byte类型,String类型,boolean类型
你 发表评论:
欢迎- 04-26Java高效处理大文件读写的全方位指南
- 04-26省钱兄JAVA视频交系统开发
- 04-26Java常用工具类技术文档
- 04-26高效使用Java构建工具,Maven篇|云效工程师指北
- 04-26Java中自定义配置文件可以如此简单
- 04-26Java 技术文档(详细版)
- 04-26DuckDuckGo应用和扩展全面禁止谷歌的单点登录弹窗
- 04-26单点登录的终级解决方案-xxlSso
- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)