java - 两种加密方法的区别
问题描述
我想用 SecretKey 加密我的内容,这是我找到的 2 个解决方案:
String password = "javapapers";
PBEKeySpec pbeKeySpec = new PBEKeySpec(password.toCharArray());
SecretKeyFactory secretKeyFactory = SecretKeyFactory
.getInstance("PBEWithMD5AndTripleDES");
SecretKey secretKey = secretKeyFactory.generateSecret(pbeKeySpec);
byte[] salt = new byte[8];
Random random = new Random();
random.nextBytes(salt);
int iterations = 100;
PBEParameterSpec pbeParameterSpec = new PBEParameterSpec(salt, iterations);
Cipher cipher = Cipher.getInstance("PBEWithMD5AndTripleDES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, pbeParameterSpec);
String input = "something";
byte[] cipherText = cipher.doFinal(input.getBytes());
第二个:
String password = "javapapers";
byte[] salt = new byte[8];
Random random = new Random();
random.nextBytes(salt);
int iterations = 100;
PBEKeySpec keySpec = new PBEKeySpec(password.toCharArray(), salt, iterations, 256);
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("PBEWITHSHA256AND256BITAES-CBC-BC";);
SecretKey key = keyFactory.generateSecret(keySpec);
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
String ivStr = "0123456789abcdef";
iv = ivStr.getBytes("US-ASCII");
cipher.init(Cipher.ENCRYPT_MODE, key, new IvParameterSpec(iv));
String input = "something";
byte[] cipherText = cipher.doFinal(input.getBytes());
正如您在第一种方法中看到的那样,在创建 PBEKeySpec 时,我只需要传递 password.toCharArray()。之后,使用盐和迭代创建 PBEParameterSpec。
但在第二种方法中,在创建 PBEKeySpec 时,我需要传递 password.toCharArray()、salt、迭代。除此之外,他们在初始化密码时使用 IvParameterSpec 而不是 PBEParameterSpec。
所以我的问题:
我应该在哪里传递盐,迭代?在 PBEParameterSpec(第一种方法)或 PBEKeySpec(第二种方法)中?以及他们之间的区别?
解决方案
推荐阅读
- javascript - 从孩子设置上下文会导致无限调用循环
- druid - 使用 DataSketches 计算中位数
- javascript - 在段落文本之后放置图标,无论使用 CSS 的行长如何
- r - 将文件路径的数据框复制到 R 中的新文件夹中
- firebase - 将 Firebase 身份验证与自定义提供程序一起使用
- wordpress - 按关系字段 (ACF) 的 Elementor 帖子的自定义查询过滤器
- r - 外部不适用于具有多个参数的函数?
- xamarin.forms - 像素到 Xamarin.Forms 字体大小
- c# - .net 核心控制台应用程序强类型配置
- javascript - 如何处理ajax调用中耗时的后端任务