前言
如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。
而且听说点赞的人每天的运气都不会太差,实在白嫖的话,那欢迎常来啊!!!
SecureRandom 和 Random的区别
SecureRandom 和 Random 都是 Java 中用于生成伪随机数的类,但它们的用途和安全性有所不同。
1. Random 类
Random 类用于生成伪随机数,适用于一般的应用场景,比如模拟、游戏等不涉及安全性要求的地方。其生成的随机数是基于种子(seed)值生成的,默认情况下,它使用系统时间作为种子。虽然它在大多数情况下足够好,但并不适合用于加密或安全敏感的应用。
主要特点:
- 不适用于加密和安全敏感的应用。
- 性能较好,但安全性较低。
- 生成的随机数序列是可预测的,尤其是当攻击者知道种子时。
2. SecureRandom 类
SecureRandom 类是专门设计用来生成加密强度的伪随机数的。它使用高质量的熵源(例如操作系统提供的随机事件、硬件设备等)来生成随机数,能够抵御攻击,确保随机数的不可预测性,因此适用于加密和安全敏感的场景。
主要特点:
- 适用于需要高安全性的应用,如加密、生成密钥等。
- 生成的随机数不可预测,安全性高。
- 性能相对较差,因为它需要更多的计算资源和熵源。
因此相比Random,SecureRandom 是用于加密和安全领域的高安全性随机数生成工具,广泛应用于密码学、令牌生成、密钥生成等领域。通过不同的生成方法和种子设置,它能提供可靠的随机性,确保生成的随机数在加密系统中不可预测。在安全要求高的场景下,推荐使用 SecureRandom,而非 Random。
3. SecureRandom 使用方式
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
/**
* @author 杨镇宇
* @date 2024/12/27 10:35
* @version 1.0
*/
public class SecureRandomTest {
public static void main(String[] args) {
// 创建一个 SecureRandom 实例
SecureRandom secureRandom = new SecureRandom();
// 生成一个随机的整数
int randomInt = secureRandom.nextInt();
System.out.println("随机整数: " + randomInt);
// 生成一个指定范围内的随机整数(例如 [0, 100))
int randomInRange = secureRandom.nextInt(100);
System.out.println("随机整数(0-99): " + randomInRange);
// 生成一个随机字节数组
byte[] randomBytes = new byte[16]; // 16字节长度
secureRandom.nextBytes(randomBytes);
// 输出字节数组
System.out.println("随机字节数组: ");
for (byte b : randomBytes) {
System.out.printf("%02x ", b); // 格式化输出十六进制
}
// 生成一个随机的 long 类型数值
long randomLong = secureRandom.nextLong();
System.out.println("随机长整数: " + randomLong);
// 生成一个随机布尔值
boolean randomBoolean = secureRandom.nextBoolean();
System.out.println("随机布尔值: " + randomBoolean);
/**
* SecureRandom 支持多种算法(如 "SHA1PRNG"),
* 并且可以使用指定的算法来初始化。你可以通过 SecureRandom.getInstance() 来选择不同的算法。
*/
try {
// 使用 SHA1PRNG 算法创建 SecureRandom 实例
SecureRandom secure = SecureRandom.getInstance("SHA1PRNG");
// 生成一个随机整数
int secureRandomInt = secure.nextInt();
System.out.println("SHA1PRNG算法-随机整数: " + secureRandomInt);
} catch (NoSuchAlgorithmException e) {
System.out.println("算法不支持: " + e.getMessage());
}
}
}