IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 网络协议 -> JCE的功能分析 -> 正文阅读

[网络协议]JCE的功能分析

什么是JCE

JCE(Java Cryptography Extension)即Java密码扩展,是JDK1.4的一个重要部分。它是一组包,它们提供用于加密、密钥生成算法和协商以及 Message Authentication Code(MAC)算法的框架和实现。

它提供对对称、不对称、块和流密码的加密支持,它还支持安全流和密封的对象。它不对外出口,用它开发完成封装后将无法调用。

?

提供者是谁

提供者是特定加密算法的实现者,有的提供者(提供的加密技术)是免费的,有的不免费,IBM, Bouncy Castle, 和 RSA都是一些(加密)提供者。

JCE的功能

JCE的API都在javax.crypto包下,核心功能包括:加解密、密钥生成(对称)、MAC生成。

一. 加解密

加解密功能由Cipher组件提供,其也是JCE中最核心的组件。

1、Cipher的几个知识点:

a. Cipher在使用时需以参数方式指定transformation

b. transformation的格式为algorithm/mode/padding,其中algorithm为必输项,如: DES/CBC/PKCS5Padding

c. 缺省的mode为ECB,缺省的padding为PKCS5Padding

d. 在block算法与流加密模式组合时, 需在mode后面指定每次处理的bit数, 如DES/CFB8/NoPadding, 如未指定则使用缺省值, SunJCE缺省值为64bits

e. Cipher有4种操作模式: ENCRYPT_MODE(加密), DECRYPT_MODE(解密), WRAP_MODE(导出Key), UNWRAP_MODE(导入Key),初始化时需指定某种操作模式。ssl证书申请

2、对称加密的算法与密钥长度选择

一般情况下,不要选择DES算法,推荐使用AES算法。一般认为128bits的密钥已足够安全,如果可以请选择256bits的密钥。注意:

a. 密钥长度是在生成密钥时指定的,如:

??? KeyGenerator generator = KeyGenerator.getInstance(“AES/CBC/PKCS5PADDING”);

??? generator.init(256);

??? SecretKey key = generator.generateKey();

b、生成长度超128bits的密钥,需单独从Oracle官网下载对应JDK版本的Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files文件,例如JDK7对应的jurisdiction policy files

3、加密示例代码

/**

* 根据密钥{@link #getKey()}对指定的明文plainText进行加密.

*

* @param plainText 明文

* @return 加密后的密文.

???? */

??? public static final String encrypt(String plainText) {

??? Key secretKey = getKey();

??? try {

??? Cipher cipher = Cipher.getInstance(“DES/ECB/PKCS5Padding”);

??? cipher.init(Cipher.ENCRYPT_MODE, secretKey);

??? byte[] p = plainText.getBytes(“UTF-8”);

??? byte[] result = cipher.doFinal(p);

??? BASE64Encoder encoder = new BASE64Encoder();

??? String encoded = encoder.encode(result);

??? return encoded;

??? } catch (Exception e) {

??? throw new RuntimeException(e);

}

}

4、解密示例代码

/**

* 根据密钥{@link #getKey()}对指定的密文cipherText进行解密.

*

* @param cipherText 密文

* @return 解密后的明文.

???? */

??? public static final String decrypt(String cipherText) {

??? Key secretKey = getKey();

??? try {

??? Cipher cipher = Cipher.getInstance(“DES/ECB/PKCS5Padding”);

??? cipher.init(Cipher.DECRYPT_MODE, secretKey);

??? BASE64Decoder decoder = new BASE64Decoder();

??? byte[] c = decoder.decodeBuffer(cipherText);

??? byte[] result = cipher.doFinal(c);

??? String plainText = new String(result, “UTF-8”);

??? return plainText;

??? } catch (Exception e) {

??? throw new RuntimeException(e);

??? }

??? }

5、带算法参数的加解密

Cipher可能用到算法参数(AlgorithmParameterSpec或AlgorithmParameters)的情形:

a. DES, DES-EDE, and Blowfish使用feedback模式时(如CBC, CFB, OFB或PCBC), 将用到IV

b. PBEWithMD5AndDES将用到salt和iteration count

下面是采用PBE算法进行加解密的示例:

/**

* 提供基于口令的加密功能.

*

* @param plainText 明文

* @return 加密后的密文.

???? */

??? public static final String pbeEncrypt(String plainText) {

??? Key pbeSecretKey = getPBEKey();

??? PBEParameterSpec pbeParamSpec = getParamSpec();

??? try {

??? Cipher cipher = Cipher.getInstance(“PBEWithMD5AndDES”);

??? cipher.init(Cipher.ENCRYPT_MODE, pbeSecretKey, pbeParamSpec);

??? byte[] p = plainText.getBytes(“UTF-8”);

??? byte[] result = cipher.doFinal(p);

??? BASE64Encoder encoder = new BASE64Encoder();

??? String encoded = encoder.encode(result);

??? return encoded;

??? } catch (Exception e) {

??? throw new RuntimeException(e);

??? }

??? }

??? ?

??? /**

* 提供基于口令的解密功能.

*

* @param cipherText 密文

* @return 解密后的明文.

???? */

??? public static final String pbeDecrypt(String cipherText) {

??? Key pbeSecretKey = getPBEKey();

??? PBEParameterSpec pbeParamSpec = getParamSpec();

??? try {

??? Cipher cipher = Cipher.getInstance(“PBEWithMD5AndDES”);

??? cipher.init(Cipher.DECRYPT_MODE, pbeSecretKey, pbeParamSpec);

??? BASE64Decoder decoder = new BASE64Decoder();

??? byte[] c = decoder.decodeBuffer(cipherText);

??? byte[] result = cipher.doFinal(c);

??? String plainText = new String(result, “UTF-8”);

??? return plainText;

??? } catch (Exception e) {

??? throw new RuntimeException(e);

??? }

??? }

??? ?

??? /**

* 获取PBE算法的密钥. 注意PBE密钥由用户提供的口令构造出来的,

* 用户提供的口令务必使用char数组, 而不能使用字符串, 字符数

* 组用完即清空.

*

* @return PBE算法的密钥.

???? */

??? private static final Key getPBEKey() {

??? // TODO come from db or System.in, NOTE: MUST be char array, not java.lang.String

??? char[] pwd = {‘%’, ‘_’, ‘A’, ‘s’, ‘9’, ‘K’};

??? SecretKey pbeKey = null;

??? PBEKeySpec pbeKeySpec = new PBEKeySpec(pwd);

??? try {

??? SecretKeyFactory keyFac = SecretKeyFactory.getInstance(“PBEWithMD5AndDES”);

??? pbeKey = keyFac.generateSecret(pbeKeySpec);

??? return pbeKey;

??? } catch (Exception e) {

??? throw new RuntimeException(e);

??? } finally {

??? Arrays.fill(pwd, ‘ ‘);

??? }

??? }

??? ?

??? /**

* 获取PBE的算法参数, 涉及salt和iterate count两个参数.

*

* @return PBE的算法参数.

???? */

??? private static final PBEParameterSpec getParamSpec() {

??? byte[] salt = { (byte) 0xab, (byte) 0x58, (byte) 0xa1, (byte) 0x8c,

??? (byte) 0x3e, (byte) 0xc8, (byte) 0x9d, (byte) 0x7a };

??? int count = 20;

??? PBEParameterSpec paramSpec = new PBEParameterSpec(salt, count);

??? return paramSpec;

??? }

测试代码:

??? String pbePlainText = “127Kjk$%2^”;

??? String pbeCipherText = pbeEncrypt(pbePlainText);

??? String pbePlainText2 = pbeDecrypt(pbeCipherText);

??? if (!pbePlainText.equals(pbePlainText2)) {

??? System.out.println(“PBE Something wrong”);

??? }

二、密钥生成

非对称密钥的生成请参考security.KeyPairGenerator,样例代码请参考JCA中的示例,对称密钥生成的示例代码如下:

??? KeyGenerator gen = KeyGenerator.getInstance(“DES”);

??? gen.init(56, new SecureRandom());

??? Key key= gen.generateKey();

三、 MAC生成

MAC技术用于确认数据的完整性,Mac要求通讯双方共享一个secret key,示例代码如下:

??? Key key = KeyGeneratorDemo.generateMac();

??? Mac mac = Mac.getInstance(“HmacSHA256”);

??? mac.init(key);

String msg = “新庄杨渡10#”;

??? byte[] result = mac.doFinal(msg.getBytes(“UTF-8”));

??? BASE64Encoder encoder = new BASE64Encoder();

??? System.out.println(encoder.encode(result));

MAC优于数据摘要的地方在于:MAC双方要共享一个密钥,所以其也有互相认证的功能,可有效防止数据摘要中明文和数据摘要被同时替换而无法发现的问题。

  网络协议 最新文章
使用Easyswoole 搭建简单的Websoket服务
常见的数据通信方式有哪些?
Openssl 1024bit RSA算法---公私钥获取和处
HTTPS协议的密钥交换流程
《小白WEB安全入门》03. 漏洞篇
HttpRunner4.x 安装与使用
2021-07-04
手写RPC学习笔记
K8S高可用版本部署
mySQL计算IP地址范围
上一篇文章      下一篇文章      查看所有文章
加:2022-03-16 22:56:30  更:2022-03-16 22:57:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 5:30:41-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码