基于Java Cipher封装通用对称加密、非对称加密、数字信封
背景:与第三方交互经常会使用加密、验签等安全策略。有的加密工具由第三方提供,有的提供算法等参数自己开发,为减少加密等功能的开发工作量,决定封装一个通用的加解密工具。
1. 名词解释
1.1. 对称加密
加密和解密使用统一密钥,AES、DES、3DES等
- 优点:简单快捷,密钥较短,破译困难
- 缺点:使用同一密钥,需要将密钥公布给第三方,实际安全性受损
1.2. 非对称加密
加解密使用不同密钥,如RSA
- 优点:双方交换公钥(私钥保密)后能避免由于密钥公布带来的安全性受损,操作规范(只有按照规范执行才能保证安全性):加密用对方公钥,解密用己方私钥;签名用己方私钥,验签用对方公钥;
- 缺点:加解密比对称加密耗时、对数据有长度限制
1.3. 数字信封
结合对称加密和非对称加密的特性,具体步骤:
- 随机生成一个对称加密密钥
- 使用第一步的密钥加密数据
- 非对称加密第一、二步的对称密钥
- 将
非对称加密过的密钥
和对称加密的密文
数据一起发送给对方
1.4. 工作模式
ECB
电子密码本模式:Electronic codebook,是最简单的块密码加密模式,加密前根据加密块大小(如AES为128位)分成若干块,之后将每块使用相同的密钥单独加密,解密同理
CBC
密码分组链接模式:Cipher-block chaining,由IBM于1976年发明,每个明文块先与前一个密文块进行异或后,再进行加密。在这种方法中,每个密文块都依赖于它前面的所有明文块。同时,为了保证每条消息的唯一性,在第一个块中需要使用初始化向量IV。
1.5. 填充方式
对不满足一个整块(block)的部分进行填充的方式。
常见填充方式:
PKCS7Padding
PKCS5Padding
NoPadding
(无填充,需要自己处理)
2. java中的密码器
2.1. 密码器Cipher
Java底层实现了常见的加密算法,使用Cipher
类,仅需要传入相应算法参数即可轻松实现加密。
Cipher
常用类方法:
方法名 | 作用 | 参数说明 |
---|---|---|
Cipher getInstance(String algorithm)
|
获取密码器实例 | algorithm:算法/工作模式/填充方式 |
void init(int MODE, Key key,AlgorithmParameterSpec iv)
|
初始化密码器 |
MODE:Cipher.ENCRYPT_MODE :加密/Cipher.DECRYPT_MODE :解密;key:密钥; iv:偏移量(CBC模式需要) |
byte[] doFinal(byte[] data)
|
计算,加密/解密(根据init 的MODE参数)
|
data:呆加密的密文 |
2.2. 密钥工具Key
Key接口表示密钥,其子接口PublicKey
和PrivateKey
分别表示公钥和私钥
获取Key的方式:
- 生成:
- 对称加密:
KeyGenerator
- 非对称加密:
KeyPairGenerator
- 对称加密:
- 还原:
- 对称加密:
new SecretKeySpec(byte[] keyBytes,String keyAlgorithm)
- 非对称加密:使用
KeyFactory
类,由于要还原,需要使用KeySpec
的子类EncodedKeySpec
,EncodedKeySpec
中含有构造函数EncodedKeySpec(byte[] encodedKey)
- 私钥:
generatePrivate(KeySpec keySpec)
,KeySpec
具体类型:PKCS8EncodedKeySpec
- 公钥:
generatePublic(KeySpec keySpec)
,KeySpec
具体类型:X509EncodedKeySpec
- 私钥:
- 对称加密:
2.3. 签名器Signature
签名工具Signature使用相当简单,代码中signAlgorithm
为签名算法,如SHA1withRSA
// 1.获取实例
Signature signature = Signature.getInstance(signAlgorithm)// 2.签名
// 2.1.初始化
signature.initSign(privateKey);
// 2.2.装填数据
signature.update(data);
// 2.3.签名
signature.sign();// 3. 验签
// 3.1.初始化
signature.initVerify(publicKey);
// 3.2.装填数据
signature.update(data);
// 3.3.验签
signature.verify(verify);
3. 封装思路
目标:
- 实现传入"算法/工作模式/填充方式"即可使用(CBC工作模式set偏移量)
- 密钥长度应该是有默认,且可选的
- 使用签名只需要set签名算法
思路:
- Cipher类加解密计算入参和响应都是byte[],至于怎样转成字符串(Hex,Base64)不关心。
- CBC工作模式需要使用偏移量iv初始化密码器,固初始化密码器的代码需要判断模式。
- 对称加密和非对称加密使用的Key不一致,所以要分开封装对称加密、非对称加密、数字信封。
- 分别封装对称加密和非对称加密后,再将两者合并为数字信封。
基于Java Cipher封装通用对称加密、非对称加密、数字信封相关推荐
- java毕业设计——基于Java+sqlserver的通用安全模块设计与实现(毕业论文+程序源码)——安全模块
基于Java+sqlserver的通用安全模块设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+sqlserver的通用安全模块设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...
- 隐私计算加密技术基础系列(下)对称与非对称加密的应用场景
本章是<隐私计算加密技术基础>系列文章的最后一篇,感慨下,终于写完了,这个春节假期除了陪家人就是写着三篇文章了.其实写之前并没有觉得是多么难的事情,感觉这些原理自己都比较清楚,但是随着写的 ...
- 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)
网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...
- 对称加密非对称加密混合加密
对称加密&非对称加密&混合加密 写于前 iOS中常在哪些场景应用到 写一个系列 本文概要 对称加密(Symmetric Cryptography) 非对称加密(ASymmetric C ...
- 对称加密 非对称加密
目录 一.加解密算法 二.算法体系 三.对称加密 四.非对称加密 五.混合加密机制 六.DES加密原理 七.3DES加密原理 八.AES加密原理 九.RSA加密原理 十.EIGamal加密原理 十一. ...
- 对称加密非对称加密怎么一起使用(初级版)
对称加密 加密和解密使用相同的密钥,使用一把钥匙,所以叫对称加密,对称 加密包括多种算法,如:DES,3DES,AES 加密长度一般小于256位,防止数据被泄. 优点:加密和解密的速度快.缺点:因为使 ...
- Linux系统安全概述-sudo授权-pam认证机制-对称加密-非对称加密-md5-数字证书
内容: 17.1 Linux系统安全概述-su-sudo授权 17.2 pam认证机制概述 17.3 对称加密-非对称加密方法 17.4 md5-sha1-哈希算法使用方法 17.5 CA证书的作用 ...
- Linux加密和安全篇(一)gpg、对称和非对称加密、哈希算法
对于linux运维工作者而言,加密技术已经很早就用于数据的存储和数据之间的交换.我们可以会为了防止你的网站.服务器或者系统,我们会使用一些手段来防止一些恶意的攻击或者访问.一下就对linux的安全和加 ...
- HTTPS(对称加密+非对称加密+证书)
目录 1. 加密和解密 HTTPS工作过程 2. 对称加密 3. 对称加密 4. 既然都有非对称加密了,那为啥还要有对称加密 5. 中间人攻击 6. 引入证书 HTTPS 也是一个应用层协议. 是在 ...
最新文章
- 原来JScript中的关键字'var'还是有文章的
- CentOS6.3 安装配置 ant
- 深入解析NoSQL数据库的分布式算法
- JZOJ 3871. 【NOIP2014八校联考第4场第1试10.19】无聊的游戏(game)
- springboot2.5.0 整合 redis 配置详解
- java 内部类and匿名类
- cent os mysql 内存_Cent OS – MySQL – 主从配置
- 【C++】判断指定元素是否在vector中的若干种方法小结
- AD使用技巧 内附AD18下载地址
- wunderlist会提示找不到libffi.so.5
- 单片机基础教程那么多,什么样才是靠谱的学习方式
- Arturia CZ V(音频合成器)v1.0.0.2695官方版
- html怎么调整成苹方,CSS 苹方字体
- 微软宣布与神州数码合作希望利用区块链技术优化金融、电子商务、娱乐等行业!
- 代码重复率检查工具jsinspect 检查重复代码,去掉冗余代码。
- 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)
- Historian 7.0 安装说明
- JSON和byte[]
- 雷鸣的游戏人生(六) --- 如何开始学习编程?
- Vue学习25_Vue的异步操作Promise