本文档不讲解签名/加密相关的理论知识, 仅列出通过Java实现的方式.

  待处理: Hutool含有很多工具的封装, 有时间需要好好研究一下(https://blog.csdn.net/moshowgame/article/details/80087954)

对称加密

加解密使用的是同一个秘钥
基于“对称密钥”的加密算法主要有DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish等。本文只介绍最常用的对称加密算法DES、3DES(TripleDES)和AES。

非对称加密

加解密使用的是不同的秘钥
基于“非对称密钥”的加密算法主要有RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)。
使用最广泛的是RSA算法,Elgamal是另一种常用的非对称加密算法。

使用场景

在互联网后端技术中非对称加密技术主要用于登录、数字签名、数字证书认证等场景。

疑问: 既然堆成加密存在安全问题, 为什么还使用对称加密呢? ( 我同事告诉我, 当前功能不开放到外网, 使用对称加密即可 )

使用到的依赖包hutool

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>4.6.1</version>
</dependency>

AES对称加密/解密

public String encryptAES(String data, String key) throws Exception {
//生成一个随机秘钥
//byte[] keyRandom = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//将秘钥转为Base64
//String keyRandomEncode = Base64.encode(keyRandom); key = "EC/Z+S7c3EFJa2dtvLyekg==";

//将Base64编码的秘钥的格式进行解码转换
byte[] keyByte = Base64.decode(key);
//加密
AES aes = SecureUtil.aes(keyByte); //构建
byte[] encryptData = aes.encrypt(data); //加密
//加密后的数据转为Base64
String encryptDataEncode = Base64.encode(encryptData);

//将Base64编码加密数据和秘钥的格式进行解码转换
byte[] data2 = Base64.decode(encryptDataEncode);
byte[] key2 = Base64.decode(key);
//解密
AES aes2 = SecureUtil.aes(key2);
byte[] decrypt = aes.decrypt(data2); return "秘钥: "+ key + ", 加密后的数据: "+ encryptDataEncode + ", 解密后的数据: "+ new String (decrypt);
}

其他

    @Overridepublic String dataSign(MsgForm msgForm) throws Exception {
String ywData = msgForm.getData();
String prikeyYlf = msgForm.getPrivateKey();
msgForm.getKeyLen();
Sign sign = new Sign(SignAlgorithm.SHA1withRSA, prikeyYlf, null);
byte[] encrypt = sign.sign(StrUtil.bytes(ywData, CharsetUtil.CHARSET_UTF_8));
return Base64.encode(encrypt);
} @Overridepublic boolean verifySign(MsgForm msgForm) throws Exception {
String ywData = msgForm.getData();
String signData = msgForm.getSignData();
String publicKey = msgForm.getPublicKey();
msgForm.getKeyLen();
Sign sign = new Sign(SignAlgorithm.SHA1withRSA, null, publicKey);
boolean encrypt = sign.verify(StrUtil.bytes(ywData), Base64.decode(signData));
//return Base64.encode(encrypt);
return encrypt;
} @Overridepublic String encrypt(MsgForm msgForm) throws Exception {
RSA rsa = new RSA(null, msgForm.getPublicKey());
byte[] encrypt = rsa.encrypt(StrUtil.bytes(msgForm.getData(), CharsetUtil.CHARSET_UTF_8), KeyType.PublicKey);
return Base64.encode(encrypt);
} @Overridepublic String decrypt(MsgForm msgForm) throws Exception {
RSA rsa = new RSA(msgForm.getPrivateKey(), null);
byte[] decrypt = rsa.decrypt(Base64.decode(msgForm.getData()), KeyType.PrivateKey);
return Base64.encode(decrypt);
} @Overridepublic void dataReceive(MsgForm msgForm) throws Exception {
SimpleDateFormat ft = new SimpleDateFormat("yyyyMMddHHmmsszzz");
StringBuffer filePath = new StringBuffer(Config.getProperty("download.path"));
filePath.append("99_");
filePath.append(msgForm.getBusiCode()+"_"); //业务类型(6)
filePath.append(ft.format(new Date())+"_"); //yyyyMMddhhmisszzz(17)
filePath.append(new Random().nextInt(10)); //2位随机数
filePath.append(new Random().nextInt(10));
filePath.append(".XML"); //.XML
//将数据写入到filePath
FileWriter fw = new FileWriter(filePath.toString(),"UTF-8");
byte[] pdfData = Base64.decode(msgForm.getData());
fw.write(pdfData,0,pdfData.length);
} @Overridepublic String encryptAES(String data, String key) throws Exception {
//生成一个随机秘钥
//byte[] kkkkRandom = SecureUtil.generateKey(SymmetricAlgorithm.AES.getValue()).getEncoded();
//将秘钥转为Base64
//key = Base64.encode(kkkkRandom);
//key = "7Df05RgSzVm8/wWzUeTDaA=="; //将Base64编码的秘钥的格式进行解码转换
byte[] keyByte = Base64.decode(key);
//加密
AES aes = SecureUtil.aes(keyByte); //构建
byte[] encryptData = aes.encrypt(data); //加密
//加密后的数据转为Base64
return Base64.encode(encryptData);
} @Overridepublic String decryptAES(String data, String key) throws Exception {
//key = "7Df05RgSzVm8/wWzUeTDaA==";
//将Base64编码加密数据和秘钥的格式进行解码转换
byte[] dataByte = Base64.decode(data);
byte[] keyByte = Base64.decode(key);
//解密
AES aes = SecureUtil.aes(keyByte); //构建
byte[] decrypt = aes.decrypt(dataByte); //加密
return new String (decrypt); //转换为字符串返回
}

签名/加密_Java_hutool( 01 代码实现 )的更多相关文章

  1. 使用Oracle Wrap工具加密你的代码

    Oracle提供Wrap工具,可以用于加密你的Package等.不过需要注意的是,加密后的代码无法解密,你需要保管好你的源代码. 以下是个例子: 1.源代码 create or replace fun ...

  2. 【转】js生成接口请求参数签名加密

    js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...

  3. 查看加密的vba代码

    查看加密的vba代码,可以使用这个工具,excel文件里面的宏代码一览无余. https://files.cnblogs.com/files/laoxia/PVP.zip

  4. js生成接口请求参数签名加密

    js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...

  5. 签名&加密的区别

    https://www.zhihu.com/question/27669212/answer/38037256 就拿A给B发送经过签名加密信息来说: 1.A对信息签名的作用是确认这个信息是A发出的,不 ...

  6. 实验吧-杂项-WTF?(python 01代码转图片)

    比较新的题型了吧. code为base64码,转码出来是01代码,直接蒙圈,查阅相关wp才知道是转图片的. 复制到编辑器里可以看到一共65536个数字,开方是256,于是这就是一个方形的图片了–> ...

  7. 总结Java常用到的六个加密技术和代码

    加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...

  8. h5请求签名加密

    签名说明 签名对 url + method + 业务参数 进行统一签名,防止重放和篡改 客户端js对加密逻辑和appSecret进行混淆加密处理,增加破解难度 客户端本地存储appid 和 appSe ...

  9. iOS 3DES加密解密(一行代码搞定)

    3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...

随机推荐

  1. php实现微信小程序登录

    以上是官方的流程介绍,已经说的很详细了,现在简单介绍一下流程 前端通过wx.login生成code传递给后端,后端通过提交Appid + appSecret + code 到微信方服务器 获取 ses ...

  2. git 显示文件改动,但无具体改动信息

     事件:        同步代码,进行了换行符替换 过程 : 同步代码,在正式服务器的 git 分支基础上创建新的分支,按照同步代码流程,将对方代码换行符转换(对方mac,我方windows) 替换需 ...

  3. stal 安装

    1.1 准备实验环境: 安装系统 1)硬件配置如下 2) 先把光标放到”install CentOS 7”,按 Tab键编辑内核参数,添加 (net.ifnames=0 biosdevname=0) ...

  4. python笔记006-文件操作

    1文件操作... 1 1.1打开和关闭文件... 1 1.1.2 open函数... 1 1.2 文件 File对象的属性... 1 1.2.1 属性... 1 1.2.2 方法... 2 1.2.3 ...

  5. 写CSDN博客

    文章目录 前言 写博客的规范 写博客的小技巧 版权声明模板 博客表格模板 更改博客字体和颜色 LaTeX 数学公式 前言 这是一篇关于写CSDN博客的文章.记录我的博客规范,技巧,模板,心得. 写博客 ...

  6. 【判环】Perpetuum Mobile

    Perpetuum Mobile 题目描述 The year is 1902. Albert Einstein is working in the patent office in Bern. Many ...

  7. asp.net mvc抓取微信文章里面所有的图片

    /// <summary> /// 下载指定URL下的所有图片 /// </summary> public class WebPageImage { /// <summa ...

  8. (转)从0移植uboot(三) _编译最小可用uboot

    ref: https://www.cnblogs.com/xiaojiang1025/p/6436752.html 前两篇介绍了uboot-2013.01的配置原理以及大体的运行流程,本文将讨论如何对 ...

  9. Spring Boot 默认首页

    //继承 WebMvcConfigurerAdapter @Override public void addViewControllers(ViewControllerRegistry registr ...

  10. 【前端】安装wampserver提示丢失MSVCR100.dll的解决方法

    先装Visual C++,再装wampserver 下载的时候请注意选择对应的32bit还是64bit的.然后安装. 再安装wamp