1
wo642436249 OP 代码如下:
加密: 参数是密码 public static String AdminPasswordEncrypt(String password) throws Exception { //AES-256-ECB KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(password.getBytes("utf-8")); return new Base64().encodeToString(encrypted); } 解密:参数是加密后的密码 public static String AdminPasswordDecrypt(String enPassword) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("AES"); kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.DECRYPT_MODE, skeySpec); byte[] encrypted1 = new Base64().decode(enPassword); byte[] original = cipher.doFinal(encrypted1); String originalString = new String(original, "utf-8"); return originalString; } 加密时没有报错,解密时一直报错,不晓得如何修改,望大佬指点。 |
2
lhx2008 2019-05-05 08:41:30 +08:00 via Android
java 的加密解密挺麻烦,有个轮子是 jasypt
|
3
wo642436249 OP @lhx2008 好的,我先了解一下这个轮子。说到 java 加密解密麻烦,我刚上手 spring boot 的时候感觉 Java 写一般的 web 项目的时候有的地方感觉比 php 还简单,但是做到这个加解密的时候发现是真费劲
|
4
lhx2008 2019-05-05 08:50:58 +08:00 via Android
@wo642436249 是的,而且你用 java 自带的是非线程安全的,jasypt 可以和 springboot 整合
|
5
vance 2019-05-05 09:04:10 +08:00
导入的包是什么,我运行下
|
6
wolfie 2019-05-05 09:12:00 +08:00
`new SecureRandom(AdminOpensslKey.getBytes())`
加密、解密时候产生的是一个值吗。 |
7
Cyron 2019-05-05 09:13:06 +08:00
KeyGenerator kgen = KeyGenerator.getInstance("AES");
SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG"); secureRandom.setSeed(secureKey.getBytes()); kgen.init(128, secureRandom); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] byteContent = content.getBytes("utf-8"); byte[] result = cipher.doFinal(byteContent); return encodeBASE64(result); |
8
skypyb 2019-05-05 09:38:06 +08:00 via Android
我之前写着玩的一小工具,里面有我封装的加密 /签名组件。有 aes 的。 你看看用的上不。
https://github.com/skypyb/JwtBuilder-CryptographicComponent |
9
Citrus 2019-05-05 09:55:10 +08:00
KeyGenerator kgen = KeyGenerator.getInstance("AES");
kgen.init(256, new SecureRandom(AdminOpensslKey.getBytes())); SecretKey secretKey = kgen.generateKey(); byte[] enCodeFormat = secretKey.getEncoded(); SecretKeySpec skeySpec = new SecretKeySpec(enCodeFormat, "AES"); 你每次加解密随机生成一个 Key,怎么玩?这是在学习猴子排序法么。。。随机到正确的 Key 就能解密成功? |
10
scoful 2019-05-05 09:55:51 +08:00
是不是 java 安全那个证书的问题,google 一下
|
11
jinue9900 2019-05-05 10:19:05 +08:00
你的是 jdk1.8_162 以上的版本嘛 这个版本除去了加密的一些限制
|
12
wo642436249 OP @skypyb 有 AES-256-ECB 这个加解密的方法嘛?
|
13
HangoX 2019-05-05 10:37:17 +08:00 1
https://github.com/google/tink 谷歌为了防止大家把加密解密写错,专门出了一个多语言平台的库
|
14
xiangyuecn 2019-05-05 10:45:26 +08:00
i...i...iv
简单点的:保证对同一内容的加密 每次返回结果都一样,再来谈只用一个参数(密码)来解密。问题解决。 |
15
qwerthhusn 2019-05-05 10:51:37 +08:00
```
public static void main(String[] args) throws Exception { // openssl enc -e -nosalt -aes-128-ecb -p -K 71776572747975696f70617364666768 -in 1.txt -out 1.enc // base64 1.enc byte[] keyPlain = "qwertyuiopasdfgh".getBytes(Charsets.ISO_8859_1); System.out.println("key = " + Hex.encodeHexString(keyPlain)); SecretKeySpec key = new SecretKeySpec(keyPlain, "AES"); byte[] plain = "ABCDEF\n".getBytes(Charsets.ISO_8859_1); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); cipher.init(Cipher.ENCRYPT_MODE, key); byte[] encrypted = cipher.doFinal(plain); System.out.println(Base64.encodeBase64String(encrypted)); } ``` 用 Java 的用 OpenSSL 加出来的结果是一样的 |
17
WordTian 2019-05-05 10:59:04 +08:00 via Android
|
18
tcitry 2019-05-05 11:00:35 +08:00
|
19
wo642436249 OP @vance 照着代码敲,idea 编辑器自动加载了,哈哈
|
20
gaius 2019-05-05 11:42:01 +08:00
加密解密的 key 要一样,如果有 iv iv 也要一样... 如果是 jdk7 提示 key 长度不合法还要去 Oracle 下载 2 个 jar
|
21
wo642436249 OP @gaius 用的是 8 版本的
|