【密码学】

您所在的位置:网站首页 websphere官方文档 【密码学】

【密码学】

2023-03-20 15:12| 来源: 网络整理| 查看: 265

csdn

👨‍💻作者简介:大山里的菜籽儿 📖所属专栏:《密码学》 ❤️‍🔥个人感悟:技术如山,登其一山,再现一山。 👦适用人群:有密码学基础的人群

在这里插入图片描述

文章目录 📁前言📁JCA是什么📁设计原则📂实现独立性📂实现互操作性📂算法可拓展性 📁JCA实现架构📂简要描述实现过程📂详细实现,举例说明 📁写在最后

📁前言

大家都知道安全性,也是JAVA重要特性之一。但是其安全性体现在哪里呢?异常处理机制、垃圾回收机制等等。那么除了这些还有什么呢?那就是JCA体系,它到底是什么?这篇文章就带你认识一下。那要是跟它认识了,以后应用程序中使用安全服务的时候,不就是打声招呼的事情吗?

📁JCA是什么

JCA全称为Java Cryptography Architecture,译为Java加密体系。JCA包括Provider的架构以及一系列数字签名、信息摘要、证书、证书验证、加密和随机数产生的API等等。这些API可以让开发人员简单的将安全服务集成到应用程序中。

个人理解:与JDBC类似,JDBC提供数据库操作服务,JCA提供安全服务。

📁设计原则 📂实现独立性

实现独立性:应用程序不需要实现安全算法。

只需要向JCA请求安全服务,由Provider提供,调用其标准接口便可以集成到应用程序中。应用程序可能会依赖多个独立提供者(Provider)实现安全服务。 📂实现互操作性

实现互操作性:Provider可以跨应用互相操作。

应用程序不绑定到特定的provider,并且provider不绑定到特定的程序。也就意味着对于相同算法,Provider间产生的密钥或者签名可以互相使用。 📂算法可拓展性

算法可拓展性:JCA中包含基础的安全服务Provider。

如果基础的安全服务Provider不满足应用加密需求,也可以支持自定义的Provider安装。 📁JCA实现架构 📂简要描述实现过程

在这里插入图片描述

0️⃣java.security.Provider是所有安全Provider的基类,也就是图中的Provider安全服务 。 1️⃣每个CSP,全称为(Cryptographic Service Providers)都包含一个类的实例。也就是图中的MessageDigest Provider实例,并且每个实例都有其实现的安全算法。比如图中的ProviderA、B、C分别实现了不同的散列算法。 2️⃣使用JCA时,采用以下API请求特定类型算法对象以及安全服务。如果不是特定的Provider则采用上图的方式从ProviderA->ProviderC依次搜索的指定的安全算法服务,否则直接定位到特定的安全算法服务。

//不是特定的Provider md = MessageDigest.getInstance("SHA-512"); //特定的Provider md = MessageDigest.getInstance("SHA-512", "ProviderB"); 📂详细实现,举例说明

经过上一小节的简易描述实现,可能大家还有些懵懂,这一节以某应用程序想要实现DES加密安全服务为例,让大家更详细的了解实现过程。

在这里插入图片描述 0️⃣Ciphert引擎类调用getInstance()工厂方法,请求JCA中DES算法提供者的实例。 1️⃣搜索每一个CSP,最终在CSP2中找到了具体的条目(不只包含DES)。 2️⃣找到DesCipher具体实现类,继承自CipherSPI。 3️⃣创建DesCipher具体实例,封装到Cipher中,返回给应用程序。 4️⃣应用程序执行init方法,会执行CipherSPI中的engineInit方法初始化DesCipher,这时就可以使用DES加密安全服务。

可参照下方代码理解。

import javax.crypto.Cipher; import javax.crypto.SecretKey; import javax.crypto.SecretKeyFactory; import javax.crypto.spec.DESKeySpec; import java.security.SecureRandom; /** * @BelongsProject: jcademo * @BelongsPackage: desdemo * @Author: shoanjen * @CreateTime: 2023-03-14 16:15 * @Description: TODO * @Version: 1.0 */ public class Des { /** * @description: * @author: shoanjen * @date: 2023/3/14 16:20 * @param: [dataDes, wordPass],dataDes为要加密的数据,wordPass为加密密码, * @return: byte[] **/ public byte[] desCrypto(byte[] dataDes, String wordPass) { try{ //可信任随机数源 SecureRandom random = new SecureRandom(); DESKeySpec desKey = new DESKeySpec(wordPass.getBytes()); //创建密钥工厂 SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES"); //生成DES加密密钥 SecretKey securekey = keyFactory.generateSecret(desKey); //Cipher对象实际完成加密操作,就是图中过程的第一步 Cipher cipher = Cipher.getInstance("DES"); //init初始化des实例 cipher.init(Cipher.ENCRYPT_MODE, securekey, random); return cipher.doFinal(dataDes); }catch(Throwable e){ e.printStackTrace(); } return null; } }

附重要源码解析图,帮助理解 在这里插入图片描述 在这里插入图片描述

📁写在最后

感谢大家的阅读,如有建议或错误,烦请提出与指正。一个初入密码行业的java开发,希望与大家共同进步。



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3