java jce_了解Java JCE的加密

java jce_了解Java JCE的加密阅读提示:Java密码扩展(TheJavaCryptographyExtension),是JDK1.4的一个重要部分,本文介绍JCE的安装和使用。首先演示如果安装配置JCE(静态安装),然后是如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。Java密码扩展(TheJavaCryptographyExtension),是JDK1.4…

大家好,又见面了,我是你们的朋友全栈君。

阅读提示:Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,本文介绍JCE的安装和使用。首先演示如果安装配置JCE(静态安装),然后是如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。

Java密码扩展(The Java Cryptography Extension),是JDK1.4的一个重要部分,基本上,他是由一些包构成的,这些包形成了一个框架并实现了一些加密,密钥生成算法和协议,消息认证码等算法,这篇文章将想你介绍JCE的安装和使用。

值得注意的是,尽管JCE是JDK1.4的核心包的一部分,我们将首先用JDK1.2及高一点的版本向你演示一下如何安装配置JCE(静态安装)。稍后,将向你介绍如何在不安装的情况下使用JCE(动态安装)。最后,将演示怎么生成密钥和密码,及如果进行基本的加密、解密。

提供者是什么?

提供者是特定加密算法的实现者,有的提供者(提供的加密技术)是免费的,有的不免费,IBM, Bouncy Castle, 和 RSA都是一些(加密)提供者.在本文的后面,我们将考察一下来自Bouncy Castle的RSA算法。Sun 也向大家说明了如果实现自己的提供者(需要符合jDK的一些约定)。

静态安装

在安装和使用JCE之前,你需要从 Sun Web site(这里是以暗中sun的提供者为例)。获得他的安装包,JCE有sun他自己的安全提供者-sunJCE,为了吧sunJCE静态的安装到默认的提供者列表中,你需要修改安全属性文件:

◆\jre\lib\security\java.security (Win32)

◆/jre/lib/security/java.security (UNIX)

如果你把JDK安装在C:\jdk1.3,你需要编辑以下文件:

C:\jdk1.3\jre\lib\security\java.security

为了安装SunJCE,你需要在以上文件中加入:

security.provider.n=com.sun.crypto.provider.SunJCE

把n用你加入的提供者的优先级代替(注意:序号要保持递增,不能跳过,但可以调整前后顺序)。

Listing A 用于查看你安装过的提供者的信息,结果在Listing B中列出,显示提供者的能力,比如说可用的加密算法。

Listing A:ProviderInformation.java

import java.security.Provider;

import java.security.Security;

import java.util.Set;

import java.util.Iterator;

public class ProviderInformation {

public static void main(String[] args) {

Provider[] providers = Security.getProviders();

for (int i = 0; i < providers.length; i++) {

Provider provider = providers[i];

System.out.println(“Provider name: ” + provider.getName());

System.out.println(“Provider information: ” + provider.getInfo());

System.out.println(“Provider version: ” + provider.getVersion());

Set entries = provider.entrySet();

Iterator iterator = entries.iterator();

while (iterator.hasNext()) {

System.out.println(“Property entry: ” + iterator.next());

}

}

}

}

Listing B:ProviderInformation.java output

Provider name: SUN

Provider information: SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests;

SecureRandom; X.509 certificates; JKS keystore)

Provider version: 1.2

Property entry: Alg.Alias.KeyFactory.1.2.840.10040.4.1=DSA

Property entry: Alg.Alias.Signature.1.2.840.10040.4.3=SHA1withDSA

Property entry: Alg.Alias.KeyPairGenerator.OID.1.2.840.10040.4.1=DSA

Property entry: Signature.SHA1withDSA KeySize=1024

Property entry: Signature.SHA1withDSA ImplementedIn=Software

动态安装:Listing c 说明了如何在运行时动态加载安全提供者,要注意的是,当你用Security.addProvider(…)加载提供者时,它是对整个JVM环境都有用的;

Listing C:DynamicProvider.java

import java.security.Security;

public class DynamicProvider {

public static void main(String[] args) {

// This is all there is to it!

Security.addProvider(new com.sun.crypto.provider.SunJCE());

}

}

如前所述,当你安装一个提供者时,你用n来指明此提供者的优先级,但一个算法的实例被调用时,JVM将按照提供的优先级来在已经安装的提供者中查找可用的实现,并使用他首先找到的可用算法。你也可用在调研时加上附加参数来指明要在那个提供者中寻找使用的算法。

实现细节:

JCE API包含了大量的为实现安全特性的类和接口,首先,我们做一个DES对称加密的例子。

生成密钥:

Listing D 展示了如果初时化密钥生成器来生成密钥;

Listing D:DESKeyGenerator.java

import javax.crypto.KeyGenerator;

import java.security.Key;

import java.security.NoSuchAlgorithmException;

import java.security.Security;

public class DESKeyGenerator {

public static void main(String[] args) {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

try {

KeyGenerator kg = KeyGenerator.getInstance(“DES”);

Key key = kg.generateKey();

System.out.println(“Key format: ” + key.getFormat());

System.out.println(“Key algorithm: ” + key.getAlgorithm());

}

catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

}

}

为了生成密钥,我们首先要初始化密钥生成器,这一步可以通过调用KeyGenerator类的静态方法getInstance来实现。我们所用的vanilla DES算法没有模式和填充模型。你同样可以(在getInstance(“”))传入DES/ECB/PKCS5Padding来指明模式(ECB)和填充模式(PKCS5Padding);也可以传入另外一个参数指明所用的提供者,不过这是可选的;

KeyGenerator kg = KeyGenerator.getInstance(“DES”);

一旦我们有了特定的密钥生成对象,我们就可以用他得到密钥:

Key key = kg.generateKey();

生成密码:

生成密码的过程跟生成密钥类似,需要调用Cipher类的getInstance方法,参数要跟生成密钥时用的参数保持一致;

Cipher cipher = Cipher.getInstance(“DES”);

Listing E 说明了如果操作:

Listing E: DESCipherGenerator.java

import javax.crypto.Cipher;

import javax.crypto.NoSuchPaddingException;

import java.security.Security;

import java.security.NoSuchAlgorithmException;

public class DESCipherGenerator {

public static void main(String[] args) {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

try {

Cipher cipher = Cipher.getInstance(“DES”);

System.out.println(“Cipher provider: ” + cipher.getProvider());

System.out.println(“Cipher algorithm: ” + cipher.getAlgorithm());

}

catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

catch (NoSuchPaddingException e) {

e.printStackTrace();

}

}

}

加解密数据

加密是对字节的,所以保密行比较高,当你准备好了密钥和密码时,你已经做好了加密的准备,要注意的时,同一个算法要用相同的密钥和密码,比如说,你不能用DESsede的密钥,用DES的密码,密码对象用同一个方法对数据进行加密和解密,所有你要首先初时化,让他知道你要干什么:

cipher.init(Cipher.ENCRYPT_MODE, key);

这就将初始化Cipher类,以准备好加密数据,.最简单的加密方法及时对传入的字节数组调用doFinal方法:

byte[] data = “Hello World!”.getBytes();

byte[] result = cipher.doFinal(data);

Listing F 是详细的代码

Listing F: DESCryptoTest.java

import javax.crypto.Cipher;

import javax.crypto.KeyGenerator;

import javax.crypto.NoSuchPaddingException;

import javax.crypto.IllegalBlockSizeException;

import javax.crypto.BadPaddingException;

import java.security.Key;

import java.security.Security;

import java.security.NoSuchAlgorithmException;

import java.security.InvalidKeyException;

public class DESCryptoTest {

public static void main(String[] args) {

Security.addProvider(new com.sun.crypto.provider.SunJCE());

try {

KeyGenerator kg = KeyGenerator.getInstance(“DES”);

Key key = kg.generateKey();

Cipher cipher = Cipher.getInstance(“DES”);

byte[] data = “Hello World!”.getBytes();

System.out.println(“Original data : ” + new String(data));

cipher.init(Cipher.ENCRYPT_MODE, key);

byte[] result = cipher.doFinal(data);

System.out.println(“Encrypted data: ” + new String(result));

cipher.init(Cipher.DECRYPT_MODE, key);

byte[] original = cipher.doFinal(result);

System.out.println(“Decrypted data: ” + new String(original));

}

catch (NoSuchAlgorithmException e) {

e.printStackTrace();

}

catch (NoSuchPaddingException e) {

e.printStackTrace();

}

catch (InvalidKeyException e) {

e.printStackTrace();

}

catch (IllegalStateException e) {

e.printStackTrace();

}

catch (IllegalBlockSizeException e) {

e.printStackTrace();

}

catch (BadPaddingException e) {

e.printStackTrace();

}

}

}

总结:JCE是个功能强大的API,提供了众多的加密方法和其他安全相关的属性,我们已经找到怎样动态和静态安装JCE,并用DES对一段简单的信息进行了加密和解密,在本系列的第二部分,我们将把本文的知识用到现实的应用中去,将告诉大家如果写一个跟Socket配合使用的包装类(Wrapper),用以加密你网上交易的重要信息。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/148129.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • React 路由详解(超详细详解)

    React 路由详解(超详细详解)ReactReact路由对SPA的理解1.单页Web应用(singlepagewebapplication,SPA)。2.整个应用只有一个完整的页面。3.点击页面中的链接不会刷新页面,只会做页面的局部更新。4.数据都需要通过ajax请求获取,并在前端异步展现。路由的理解1.什么是路由1.一个路由就是一个映射关系(key:value)2.key为路径,value可能是function或component2.路由分类1.后端路由:1)理解:value是fun

    2022年4月28日
    45
  • 运维架构体系搭建系列-目录篇[通俗易懂]

    运维架构体系搭建系列-目录篇[通俗易懂]前言:去年新加入的一家公司,传统企业这里就不说名字了,不过公司规模还是有的,鄙人来之前基本上用的都是saas产品,加上疫情原因,没及时跳坑,做为一个半吊子自动化运维开发当然是选择先混日子,后面等来了一个新的技术团队,开始做自己的系统和产品。一、云选型及网络规划1、云产品选型2、网络规划二、devops相关服务搭建1、cicd工具链搭建2、项目管理三、db&中间件1、数据库管理2、中间件管理四、k8s环境及微服务治理1、k8s选型及搭建2、mse管理五、监控&日志

    2022年7月17日
    13
  • Win10 CMD命令大全—超好用快捷键

    Win10 CMD命令大全—超好用快捷键一、WindowsCMD命令大全1、按组合键Win(Windows图标键)+R键打开运行窗口,输入“cmd”按回车即可打开cmd命令提示符2、在窗口右击选择属性可进行个性化设置~命令功能1、calc启动计算器2、appwiz.cpl程序和功能3、certmgr.msc证书管理实用程序4、charmap启动字符映射表5、chkdsk.exeChkdsk磁盘检查(管理员身份运行命令提示符)6、cleanmgr打开磁盘清理工具7、

    2022年5月17日
    873
  • 什么是DMIPS_dm dmi dmp 区别

    什么是DMIPS_dm dmi dmp 区别MIPS:MillionInstructionsexecutedPerSecond,每秒百万条指令,用来计算同一秒内系统的处理能力DMIPS:DhrystoneMillionInstruc

    2022年8月4日
    2
  • 手写一个tornado框架session功能

    手写一个tornado框架session功能

    2021年7月4日
    75
  • 把一个数据表导入另一个数据库_把一个表里的数据导入另一个表

    把一个数据表导入另一个数据库_把一个表里的数据导入另一个表文章作者:姜南(Slyar)文章来源:SlyarHome(www.slyar.com)转载请注明,谢谢合作。之前发了《表达式变量批量替换器batchSQL》这篇文章,有童鞋说导入数据用phpMyAdmin提供的csv导入功能不是更好。的确,导入数据进入mysql用这个功能非常好,不过如果需要进行批量操作的是update或者其他操作呢,例如要从新的excel里批量更新某一部分的数据,总不能全…

    2022年9月2日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号