签名/加密_Java_hutool( 01 代码实现 )
本文档不讲解签名/加密相关的理论知识, 仅列出通过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 代码实现 )的更多相关文章
- 使用Oracle Wrap工具加密你的代码
Oracle提供Wrap工具,可以用于加密你的Package等.不过需要注意的是,加密后的代码无法解密,你需要保管好你的源代码. 以下是个例子: 1.源代码 create or replace fun ...
- 【转】js生成接口请求参数签名加密
js生成接口请求参数签名加密 签名算法规则: 第一步,设所有发送或者接收到的数据为集合M,将集合M内非空参数值的参数按照参数名ASCII码从小到大排序(字典序),使用URL键值对的格式(即key1=v ...
- 查看加密的vba代码
查看加密的vba代码,可以使用这个工具,excel文件里面的宏代码一览无余. https://files.cnblogs.com/files/laoxia/PVP.zip
- js生成接口请求参数签名加密
js生成接口请求参数签名加密 定义规则:将所有参数字段按首字母排序, 拼接成key1 = value1 & key2 = value2的格式,再在末尾拼接上key = appSecret, 再 ...
- 签名&加密的区别
https://www.zhihu.com/question/27669212/answer/38037256 就拿A给B发送经过签名加密信息来说: 1.A对信息签名的作用是确认这个信息是A发出的,不 ...
- 实验吧-杂项-WTF?(python 01代码转图片)
比较新的题型了吧. code为base64码,转码出来是01代码,直接蒙圈,查阅相关wp才知道是转图片的. 复制到编辑器里可以看到一共65536个数字,开方是256,于是这就是一个方形的图片了–> ...
- 总结Java常用到的六个加密技术和代码
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- h5请求签名加密
签名说明 签名对 url + method + 业务参数 进行统一签名,防止重放和篡改 客户端js对加密逻辑和appSecret进行混淆加密处理,增加破解难度 客户端本地存储appid 和 appSe ...
- iOS 3DES加密解密(一行代码搞定)
3DES(或称为Triple DES)是三重数据加密算法(TDEA,Triple Data Encryption Algorithm)块密码的通称.它相当于是对每个数据块应用三次DES加密算法.由于计 ...
随机推荐
- Win10 收件箱添加QQ邮箱(2019年5月19日)
Emmm弄的时候没截图,就语言描述吧,非常简单. 登录到网页端QQ邮箱.点我登录 登录之后,界面上端的Logo右边有个"设置"(字有点小).点它 邮箱设置下面有一堆标签,点击&qu ...
- 【5号课堂】scratch制作电子生日贺卡
贺卡在我国的使用由来已久,在古代,上层士大夫有用名帖互相问候的习俗 唐宋以后,贺卡的名称及功能有所进步,称为”门状“或“飞帖“,到了明清,又叫“红单“.“贺年帖“等等,听着名字就知功能越来越世俗化,文 ...
- Intergalaxy Trips CodeForces - 605E (期望,dijkstra)
大意: 给定矩阵$p$, $p_{i,j}$表示每一秒点$i$到点$j$有一条边的概率, 每秒钟可以走一条边, 或者停留在原地, 求最优决策下从$1$到$n$的期望用时. $f_x$为从$x$到$n$ ...
- Optional 理解
目录 Optional 理解 1. 含义 2. Optional 类中方法 3. Optional 对象不应该作为方法参数 Optional 理解 1. 含义 Optional 是一个容器对象,该容器 ...
- Java QuickSort 快速排序
Java QuickSort /** * <html> * <body> * <P> Copyright 1994-2018 JasonInternational ...
- 笔记: ASP.NET Core视图组件
视图组件 asp.net core mvc 提供了部分视图的新替代品:视图组件. 视图组件与分布视图的主要区别在于视图组件与控制器不相关.可使用在独立于单个控制器的场景,如:菜单导航.侧边栏.分页栏等 ...
- powerdesign中逆向工程后name和comment的互换
powerdesign 中,将数据库中可以逆向生成pdm的结构图,比较清晰看到系统的结构, 但假如是db先行的话,一般是db中的每个列中用comment中文注释说明这列是 干什么的,但逆向工程后,会发 ...
- Java内存模型(JMM)
JVM与线程(线程在JVM中) 1.JVM什么时候启动? 类被调用时启动,此时会启动JVM线程然后再是其他的线程(main) 2.JVM内存区域 除了程序计数器(PC)之外都有可能发生 ...
- 什么是实体关系图(ERD)? 转
https://www.visual-paradigm.com/cn/guide/data-modeling/what-is-entity-relationship-diagram/#erd-data ...
- vue + element-ui 国际化实现
1. 安装组件和插件 cnpm i element-ui -S // 安装elementcnpm i vue-i18n -S //安装i18n 2.将国际化资源放在assets目录下 3.在src下新 ...