在java中的对称密码、公钥密码、信息认证码、数字签名等密码学技术或多或少地涉及和使用了一种叫做密钥的东西。Java密钥及密钥生成方式贯穿了整个java项目足以引起我们的关注。所以java密钥到底是什么?简单来说,java中的密钥就是一个key,通过这个key可以得到最终的明文。因此,密钥实际上等同于明文。举个通俗易懂的例子,你手里拿着银行卡,可以用银行卡在取款机里取出。100万现金,那么你和有100万现金的人是等价的,也就是说你也有100万现金。
一般来说,根据安装密钥的使用次数,可分为会话密钥和主密钥。会话密钥是只在会话中使用的密钥。使用后,它将被废弃。主密钥是一种固定密钥,一直在重复使用。
说到会话密钥,我不得不提到它SSL/TLS协议,在这个协议中,每次会话都会创建一个单独的密钥来加密会话信息,即每次会话都会创建一个会话密钥。
另外,我们可以通过判断安装加密对象是内容还是密钥将密钥分成加密信息的密钥(CEK)密钥和加密密钥(KEK)。加密信息的密钥很容易理解。对称密钥和公钥密钥是CEK。加密密钥的密钥主要用于减少密钥的保存数量。
首先,我们关注的是密钥的生成。生成密钥有两种方法,使用随机数量或密码。随机数量必须具有不可推断的特性。一般来说,我们需要使用伪随机发送生成器来生成它。
Random类通常用于java代码,但不能用于生成密钥。我们可以使用java.security.Securerandom生成密码安全的随机数。
下面是两种常用用法:Securerandom:
SecureRandom random = new SecureRandom();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
byte seed[] = random.generateSeed(20);
另一种密码是指人类可以记住的密码。为了确保密码生成的密钥不会被暴力破解,有必要在密码中加盐。简而言之,向密码添加随机数,然后添加后的数量hash计算,计算出的结果可以作为密钥。
列举一些Java密钥相关类别:
SecretKeySpec,KeyGenerator,KeyFactory,SecretKeyFactory,KeyPairGenerator
对称密钥生成:SecretKeySpec keyGenerator SecretKeyFactory
生成非对称密钥:KeyPairGenerator
常用的KeyGenerator、KeyPairGenerator ;
1.用SecretKeySpec类生成密钥。
这种方法生成密钥比较简单,设置也比较少,没有随机因素。这种以及provider无关的方式指定密钥。这种方法可以用来根据字节数组构建一个 SecretKey,不需要通过一个(基于provider)SecretKeyFactory。这种类型只对原始密钥有用,可以表示为字节数组,没有任何相关的钥匙参数,如DES或Triple DES密钥。
// SecretKeySpec 要生成密钥,需要添加密钥原始文本
String key = "zhegeshikey";
byte[] keyByte = key.getBytes("UTF-8");
// 创建密钥
SecretKey secretKey = new SecretKeySpec(keyByte, algorithmDES);
2.用KeyGenerator生成密钥
这种提供(对称)密钥生成器的功能。密钥生成器使用此类产品getinstance类方法结构。KeyGenerator 对象可以重复使用,也就是说,生成密钥后,可以重复使用相同的KeyGenerator对象生成更多的密钥。代码实现如下:
// 创建KeyGenerator对象,指定算法
KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithmDES);
// 一些配置可以初始化:密钥长度、随机数等
keyGenerator.init(256);
// 配置随机串,加强加密安全
// 声明随机串可以指定种子 SecureRandom(byte[] seed)
SecureRandom random = new SecureRandom();
keyGenerator.init(random);
SecretKey secretKey = keyGenerator.generateKey();
3.用SecretKeyFactory生成密钥
代码实现如下:
// 设置密钥参数
String key = "zhegeshikey";
byte[] keyByte = key.getBytes("UTF-8");
// 创建SecretKeyFactory对象,指定算法
SecretKeyFactory secretKeyFactory = SecretKeyFactory.getInstance(algorithmDES);
// 指定密钥规范,这里的SecretKeySpec是密钥规范,而不是密钥。API真的很摩擦
DESKeySpec keySpec = new DESKeySpec(keyByte);
// 密钥按照密钥规范生成密钥
SecretKey secretKey = secretKeyFactory.generateSecret(keySpec);
4.生成密钥对称密钥
Keypairgenerator类用于生成公钥和私钥对。密钥对生成器是通过使用getinstance工厂方法(返回给定类的静态实例)构建的。特定算法的密钥对生成器可以创建可以与该算法一起使用的公钥/私钥对。它还可以将特定算法的参数与每个生成的密钥联系起来。代码如下:
// 创建 KeyPairgenerator对象指定加密算法
System.out.println(secretKeyContent);
// 输出BASE64
// 此处输出的BASE64密钥将换行;
// 用Apache代替 commons-codec.jar, Base64.encodebase64String(byte[])获得的编码字符串没有换行符
System.out.println(Base64.encode(secretKeyByte));
return secretKeyContent;
}
读完这篇文章Java密钥及密钥生成方式我相信我的朋友们在未来的项目或学习中遇到了它java密钥的相关问题不会觉得无从下手,虽不能说问题迎刃而解,至少有一些线索。也可以通过java视频课程多了解其他渠道和其他渠道。java密钥的相关知识。