动力节点旗下在线教育品牌  |  咨询热线:400-8080-105 学Java全栈,上蛙课网
首页 > 文章

java密钥及密钥生成方式

07-27 16:38 256浏览
举报 T字号
  • 大字
  • 中字
  • 小字

java中对称密码,公钥密码,消息认证码和数字签名等密码学的技术都多多少少涉及和使用到了一个叫做密钥的东西。Java密钥及方式贯穿了整个java项目,足以引起我们的重视。那么java密钥到底是什么呢?简单来说,java中的密钥就是一个key通过这个key可以获得最终的明文。所以密钥其实是和明文等价的。举个通俗易懂的例子,你的手里拿着一张银行卡,而可以通过使用银行卡在取款机里面取出100万现金,那么你和有100万现金的人是等价的,也就是说你也拥有100万现金

一般来讲,按照安装密钥的使用次数可以分为会话密钥和主密钥。会话密钥是只用在一个会话中的密钥,用完之后就废弃不用了,而主密钥是固定的密钥,一直在重复使用的密钥。

说到会话密钥就不得不提到SSL/TLS协议,在这个协议中每次会话都会创建一个单独的密钥用来加密会话消息,也就是说每次会话都会创建一个会话密钥。

此外,我们可以通过判断安装加密对象是内容还是密钥把密钥分为加密消息的密钥(CEK)和加密密钥的密钥(KEK)。加密消息的密钥很好理解,对称密钥和公钥密钥就是CEK。而加密密钥的密钥主要是为了减少密钥的保存个数。

首先,我们重点要讲的是密钥的生成。生成密钥有两种方式,使用随机数或使用口令。随机数一定要有不可被推断的特性,一般来说我们需要使用伪随机送生成器来生成。

java代码中我们通常会用到Random类,但是这个类是不能用来生成密钥的。我们可以使用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对象,指定加密算法

KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithmRSA);

// 可以初始化一些配置:密钥长度,随机数。

// 配置随机串,加强加密安全性

// 声明随机串,可以指定种子 SecureRandom(byte[] seed)

SecureRandom random = new SecureRandom();

keyPairGenerator.initialize(512, random);

// 生成密钥

KeyPair keyPair = keyPairGenerator.generateKeyPair();

// 获取公私密钥

PublicKey publicKey = keyPair.getPublic();

PrivateKey privateKey = keyPair.getPrivate();

密钥打印输出:

/**

 * 获取二进制密钥,打印密钥

 *

 * @param key

 * @return

 */

private String getKeyContent(Key key) {

   // 获取密钥二进制流

   byte[] secretKeyByte = key.getEncoded();

   // 以十六进制输出

   String secretKeyContent = BytesHexConverter.bytesToHexString(secretKeyByte);

   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密钥的相关知识。

0人推荐
共同学习,写下你的评论
0条评论
天行九歌
程序员天行九歌

6篇文章贡献29402字

作者相关文章更多>

推荐相关文章更多>

Java数据结构

HelloWorld10-31 08:24

浅谈MySQL中SQL优化的常用方法

军哥08-12 23:29

五分钟读懂UML类图

江湖人称小李白12-10 10:41

MyBatis开发框架的四大核心

IT逐梦者08-17 21:43

一次搞定continue,break和return

HelloWorld11-06 11:19

发评论

举报

0/150

取消