KeySpec & KeyGenerator
密钥相关类
SecretKeySpec,KeyGenerator,KeyFactory,SecretKeyFactory,KeyPairGenerator
- 对称密钥生成:SecretKeySpec 、keyGenerator 、SecretKeyFactory
- 非对称密钥生成:KeyPairGenerator
常用的KeyGenerator、KeyPairGenerator ;可以满足使用
先导入maven依赖:
<dependency>
<groupId>commons-codec</groupId>
<artifactId>commons-codec</artifactId>
<version>1.15</version>
</dependency>
KeySpec
这个类,顾名思义,就是一个规范。什么意思呢?
当我们想使用密钥,对某段明文信息进行加密时,不同的加密算法,对密钥的要求不同,比如要求密钥key的长度只能是8 byte。
为了解决这个密钥key的标准化问题,我们创建了一个KeySpec类,指定长度等参数,提供一个不标准的密钥key,就能得到一个标准的密钥key了。
同时为了方便后面的计算,需要指明当前这个密钥,是使用什么算法生成的。
SecretKeySpec
refer to : https://docs.oracle.com/javase/8/docs/api/javax/crypto/spec/SecretKeySpec.html
用SecretKeySpec类生成密钥。构建SecretKeySpec类,只需要传入密钥key的字节数组,以及这个密钥key使用的生成算法。
String secretKey = "123456";
SecretKeySpec aes = new SecretKeySpec(secretKey.getBytes(StandardCharsets.UTF_8), "AES");
可以看到,使用SecretKeySpec,其实并没有生成使用密钥,密钥其实就是明文的。
所以SecretKeySpec类的作用,不是生成一个密钥,而是指明这个密钥是使用什么算法生成的。
SecretKeySpec类支持创建密匙的加密算法(ASE,DES,DES3)
SecretKey secretKey = new SecretKeySpec(slatKey.getBytes(), "AES");
但需要主要的是不同的加密算法的byte数组的长度是不同的,创建密匙前最好先检测下byte数组的长度。各加密算法的密匙长度如下
加密算法 | 密匙长度 | |
---|---|---|
AES | 128、192、256 | |
DES | 56 | |
DESede | 112 |
KeyGenerator
-
用KeyGenerator生成密钥,此类提供(对称)密钥生成器的功能。
-
密钥生成器是使用此类的某个 getInstance 类方法构造的。
-
KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。
// 创建KeyGenerator对象,指定算法
KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");
// 可以初始化一些配置:密钥长度,随机数等
keyGenerator.init(256);
// 配置随机串,加强加密安全性
// 声明随机串,可以指定种子 SecureRandom(byte[] seed)
SecureRandom random = new SecureRandom();
keyGenerator.init(random);
SecretKey secretKey = keyGenerator.generateKey();
这里的 keyGenerator.init
的作用是什么呢?上面我们说到,不同的加密算法的byte数组的长度是不同的,创建密匙前最好先检测下byte数组的长度,如果指定的saltKey的长度不够,那么就需要通过KeyGenerator,来生成一个标准长度的密钥。
SecretKeyFactory
用SecretKeyFactory生成密钥,此类表示秘密密钥的工厂。
// 设置密钥参数
String key = "1234567812345678";
byte[] keyByte = key.getBytes("UTF-8");
// 打印原始的密钥key
System.out.println("origin:"+Hex.encodeHexString(keyByte)); // 31323334353637383132333435363738
// 创建SecretKeyFactory对象,指定算法
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance("DES");
// 指定密钥规范,此处的SecretKeySpec是密钥规范,而不是密钥。API真搓
DESKeySpec keySpec = new DESKeySpec(keyByte);
// 根据密钥规范生成密钥
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
// 打印使用SecretKeyFactory生成的密钥key
String s = Hex.encodeHexString(secretKey.getEncoded());
System.out.println(s); // 3132323434373738
KeyPairGenerator
-
密钥对生成,生成非对称密钥
-
KeyPairGenerator类用于生成公钥和私钥对。密钥对生成器是使用getInstance工厂方法(返回一个给定类的实例的静态方法)构造的。
-
特定算法的密钥对生成器可以创建能够与此算法一起使用的公钥/私钥对。它还可以将特定于算法的参数与每个生成的密钥关联。
// 创建 KeyPairGenerator对象,指定加密算法
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");
// 可以初始化一些配置:密钥长度,随机数。
// 配置随机串,加强加密安全性
// 声明随机串,可以指定种子 SecureRandom(byte[] seed)
SecureRandom random = new SecureRandom();
keyPairGenerator.initialize(512, random);
// 生成密钥
KeyPair keyPair = keyPairGenerator.generateKeyPair();
// 获取公私密钥
PublicKey publicKey = keyPair.getPublic();
PrivateKey privateKey = keyPair.getPrivate();
文章作者:Administrator
文章链接:http://localhost:8090//archives/keyspeckeygenerator
版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 4.0 许可协议,转载请注明出处!
评论