|  |      1wo642436249 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; } 加密时没有报错,解密时一直报错,不晓得如何修改,望大佬指点。 | 
|  |      2lhx2008      2019-05-05 08:41:30 +08:00 via Android java 的加密解密挺麻烦,有个轮子是 jasypt | 
|  |      3wo642436249 OP @lhx2008 好的,我先了解一下这个轮子。说到 java 加密解密麻烦,我刚上手 spring boot 的时候感觉 Java 写一般的 web 项目的时候有的地方感觉比 php 还简单,但是做到这个加解密的时候发现是真费劲 | 
|  |      4lhx2008      2019-05-05 08:50:58 +08:00 via Android @wo642436249 是的,而且你用 java 自带的是非线程安全的,jasypt 可以和 springboot 整合 | 
|  |      5vance      2019-05-05 09:04:10 +08:00 导入的包是什么,我运行下 | 
|  |      6wolfie      2019-05-05 09:12:00 +08:00 `new SecureRandom(AdminOpensslKey.getBytes())` 加密、解密时候产生的是一个值吗。 | 
|  |      7Cyron      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); | 
|  |      8skypyb      2019-05-05 09:38:06 +08:00 via Android 我之前写着玩的一小工具,里面有我封装的加密 /签名组件。有 aes 的。 你看看用的上不。 https://github.com/skypyb/JwtBuilder-CryptographicComponent | 
|  |      9Citrus      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 就能解密成功? | 
|  |      10scoful      2019-05-05 09:55:51 +08:00 是不是 java 安全那个证书的问题,google 一下 | 
|  |      11jinue9900      2019-05-05 10:19:05 +08:00 你的是 jdk1.8_162 以上的版本嘛 这个版本除去了加密的一些限制 | 
|  |      12wo642436249 OP @skypyb 有 AES-256-ECB 这个加解密的方法嘛? | 
|      13HangoX      2019-05-05 10:37:17 +08:00  1 https://github.com/google/tink 谷歌为了防止大家把加密解密写错,专门出了一个多语言平台的库 | 
|  |      14xiangyuecn      2019-05-05 10:45:26 +08:00 i...i...iv 简单点的:保证对同一内容的加密 每次返回结果都一样,再来谈只用一个参数(密码)来解密。问题解决。 | 
|  |      15qwerthhusn      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 加出来的结果是一样的 | 
|      17WordTian      2019-05-05 10:59:04 +08:00 via Android | 
|  |      18tcitry      2019-05-05 11:00:35 +08:00 | 
|  |      19wo642436249 OP @vance 照着代码敲,idea 编辑器自动加载了,哈哈 | 
|  |      20gaius      2019-05-05 11:42:01 +08:00 加密解密的 key 要一样,如果有 iv iv 也要一样...    如果是 jdk7 提示 key 长度不合法还要去 Oracle 下载 2 个 jar | 
|  |      21wo642436249 OP @gaius 用的是 8 版本的 |