背景:与第三方交互经常会使用加密、验签等安全策略。有的加密工具由第三方提供,有的提供算法等参数自己开发,为减少加密等功能的开发工作量,决定封装一个通用的加解密工具。

1. 名词解释

1.1. 对称加密

加密和解密使用统一密钥,AES、DES、3DES等

  • 优点:简单快捷,密钥较短,破译困难
  • 缺点:使用同一密钥,需要将密钥公布给第三方,实际安全性受损

1.2. 非对称加密

加解密使用不同密钥,如RSA

  • 优点:双方交换公钥(私钥保密)后能避免由于密钥公布带来的安全性受损,操作规范(只有按照规范执行才能保证安全性):加密用对方公钥,解密用己方私钥;签名用己方私钥,验签用对方公钥;
  • 缺点:加解密比对称加密耗时、对数据有长度限制

1.3. 数字信封

结合对称加密和非对称加密的特性,具体步骤:

  1. 随机生成一个对称加密密钥
  2. 使用第一步的密钥加密数据
  3. 非对称加密第一、二步的对称密钥
  4. 非对称加密过的密钥对称加密的密文数据一起发送给对方

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接口表示密钥,其子接口PublicKeyPrivateKey分别表示公钥和私钥

获取Key的方式:

  • 生成

    • 对称加密:KeyGenerator
    • 非对称加密:KeyPairGenerator
  • 还原
    • 对称加密:new SecretKeySpec(byte[] keyBytes,String keyAlgorithm)
    • 非对称加密:使用KeyFactory类,由于要还原,需要使用KeySpec 的子类EncodedKeySpecEncodedKeySpec中含有构造函数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签名算法

思路:

  1. Cipher类加解密计算入参和响应都是byte[],至于怎样转成字符串(Hex,Base64)不关心。
  2. CBC工作模式需要使用偏移量iv初始化密码器,固初始化密码器的代码需要判断模式。
  3. 对称加密和非对称加密使用的Key不一致,所以要分开封装对称加密、非对称加密、数字信封。
  4. 分别封装对称加密和非对称加密后,再将两者合并为数字信封。

基于Java Cipher封装通用对称加密、非对称加密、数字信封相关推荐

  1. java毕业设计——基于Java+sqlserver的通用安全模块设计与实现(毕业论文+程序源码)——安全模块

    基于Java+sqlserver的通用安全模块设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于Java+sqlserver的通用安全模块设计与实现,文章末尾附有本毕业设计的论文和源码下载地 ...

  2. 隐私计算加密技术基础系列(下)对称与非对称加密的应用场景

    本章是<隐私计算加密技术基础>系列文章的最后一篇,感慨下,终于写完了,这个春节假期除了陪家人就是写着三篇文章了.其实写之前并没有觉得是多么难的事情,感觉这些原理自己都比较清楚,但是随着写的 ...

  3. 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

    网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...

  4. 对称加密非对称加密混合加密

    对称加密&非对称加密&混合加密 写于前 iOS中常在哪些场景应用到 写一个系列 本文概要 对称加密(Symmetric Cryptography) 非对称加密(ASymmetric C ...

  5. 对称加密 非对称加密

    目录 一.加解密算法 二.算法体系 三.对称加密 四.非对称加密 五.混合加密机制 六.DES加密原理 七.3DES加密原理 八.AES加密原理 九.RSA加密原理 十.EIGamal加密原理 十一. ...

  6. 对称加密非对称加密怎么一起使用(初级版)

    对称加密 加密和解密使用相同的密钥,使用一把钥匙,所以叫对称加密,对称 加密包括多种算法,如:DES,3DES,AES 加密长度一般小于256位,防止数据被泄. 优点:加密和解密的速度快.缺点:因为使 ...

  7. Linux系统安全概述-sudo授权-pam认证机制-对称加密-非对称加密-md5-数字证书

    内容: 17.1 Linux系统安全概述-su-sudo授权 17.2 pam认证机制概述 17.3 对称加密-非对称加密方法 17.4 md5-sha1-哈希算法使用方法 17.5 CA证书的作用 ...

  8. Linux加密和安全篇(一)gpg、对称和非对称加密、哈希算法

    对于linux运维工作者而言,加密技术已经很早就用于数据的存储和数据之间的交换.我们可以会为了防止你的网站.服务器或者系统,我们会使用一些手段来防止一些恶意的攻击或者访问.一下就对linux的安全和加 ...

  9. HTTPS(对称加密+非对称加密+证书)

    目录 1. 加密和解密 HTTPS工作过程 2. 对称加密 3. 对称加密 4. 既然都有非对称加密了,那为啥还要有对称加密 5. 中间人攻击 6. 引入证书 HTTPS 也是一个应用层协议. 是在 ...

最新文章

  1. 原来JScript中的关键字'var'还是有文章的
  2. CentOS6.3 安装配置 ant
  3. 深入解析NoSQL数据库的分布式算法
  4. JZOJ 3871. 【NOIP2014八校联考第4场第1试10.19】无聊的游戏(game)
  5. springboot2.5.0 整合 redis 配置详解
  6. java 内部类and匿名类
  7. cent os mysql 内存_Cent OS – MySQL – 主从配置
  8. 【C++】判断指定元素是否在vector中的若干种方法小结
  9. AD使用技巧 内附AD18下载地址
  10. wunderlist会提示找不到libffi.so.5
  11. 单片机基础教程那么多,什么样才是靠谱的学习方式
  12. Arturia CZ V(音频合成器)v1.0.0.2695官方版
  13. html怎么调整成苹方,CSS 苹方字体
  14. 微软宣布与神州数码合作希望利用区块链技术优化金融、电子商务、娱乐等行业!
  15. 代码重复率检查工具jsinspect 检查重复代码,去掉冗余代码。
  16. 全局函数的名字应当使用“动词”或者“动词+名词”(动宾词组)
  17. Historian 7.0 安装说明
  18. JSON和byte[]
  19. 雷鸣的游戏人生(六) --- 如何开始学习编程?
  20. Vue学习25_Vue的异步操作Promise

热门文章

  1. 【OpenGL】太阳、地球、月亮实例(一)
  2. 前端实现括号匹配,假如字符串有且仅有[],{},(),''几种,判断字符串是否符合规格
  3. 学习先进计算技术,可以找到什么工作?福利待遇又如何呢?
  4. 时间同步Gardner环的matlab性能仿真
  5. C型稳定型人格的特征和职业分析(disc性格测试)
  6. JavaScript鼠标事件
  7. 《任正非给了谁一个大大的耳光》后
  8. 强烈推荐!过学校论文检测(论文查…
  9. 机柜空调的安装方式及工作原理
  10. Mac M1 jdk11 DNS错误