使用 Jasypt 和 PBKDF2WithHmacSHA1 密钥进行基于密码的 AES 加密

2023-12-31

我正在工作中实现加密机制,安全人员的要求如下:

  1. 使用 PBKDF2WithHmacSHA512、秘密密码、256 位盐和最少 20000 次迭代创建 256 位密钥。
  2. 盐应该使用 SecureRandom.getInstance("SHA1PRNG") 生成;
  3. 使用 AES256 和派生密钥进行加密。

我正在尝试使用 Jasypt 的标准PBE字符串加密器 class

encryptor.setPassword(PASSWORD);
encryptor.setAlgorithm("AES/CBC/PKCS5Padding");
encryptor.setKeyObtentionIterations(20000);
encryptor.setSaltGenerator(new RandomSaltGenerator());
encryptor.encrypt("something");

当我这样做时,我得到以下异常:

java.security.NoSuchAlgorithmException:AES/CBC/PKCS5Padding SecretKeyFactory 不可用

我是否错误地使用了 Jasypt?我在这里缺少什么?

Thanks


我最终联系了 Jasypt 的首席程序员 Daniel Fernández,他的回答是:

恐怕 Jasypt 没有提供一种方法来为 SecretKeyFactory 和 Cipher 本身的实例化指定不同的算法。对不起。

我使用了这段java代码来执行此操作(没有Jasypt):

public String encrypt(final String message) {
  final byte[] salt = generateSalt();
  final Key key = createKey(salt);

  final Cipher encryptingCipher = createCipher(Cipher.ENCRYPT_MODE, key, salt);
  final byte[] messageBytes = message.getBytes(StandardCharsets.UTF_8);
  final byte[] encryptedBytes = doFinal(encryptingCipher, messageBytes);
  final byte[] data = ArrayUtils.addAll(salt, encryptedBytes);
  return BaseEncoding.base64().encode(data);
}

private byte[] generateSalt() {
  final SecureRandom secureRandom = new SecureRandom();
  final byte[] salt = new byte[SALT_LENGTH];
  secureRandom.nextBytes(salt);
  return salt;
}

private Key createKey(final byte[] salt) {
  final PBEKeySpec spec = new PBEKeySpec(PASSWORD,
                                       salt,
                                       ITERATIONS,
                                       KEY_LENGTH);
  final SecretKey secretKey;
  try {
    secretKey = keyFactory.generateSecret(spec);
  } catch (final InvalidKeySpecException e) {
    throw new RuntimeException("Error creating SecretKey", e);
  }
  final SecretKeySpec result = new SecretKeySpec(secretKey.getEncoded(), ALGORITHM);
  spec.clearPassword();
  return result;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Jasypt 和 PBKDF2WithHmacSHA1 密钥进行基于密码的 AES 加密 的相关文章

随机推荐

  • PayPal IPN 意外变化

    从 2017 年 3 月 8 日左右开始 我们注意到一些 不是全部 PayPal IPN 出现了一些异常行为 PayPal 似乎正在推出某种变化 还有一些其他人报告了其他事情 例如 PayPal 从 IPN 端点中删除的 QueryStri
  • std::unordered_set 元素的迭代顺序是否保证始终相同?

    如果迭代的元素std unordered set多次而不更改集合的内容 但可能从中读取 计算其大小等 是否保证每次都会以相同的顺序访问元素 在你提到的具体情况下 是的 因为该标准明确规定了何时进行重新散列 并因此重新排序 它仅在插入期间发生
  • C# Random 不像 random 那样工作

    我有一个图 每个节点有 4 个子节点 我编写了一个算法来生成从开始节点到结束节点的随机路径 在每个节点 它选择一个随机的下一个节点 访问过的节点可以重新访问 代码如下 public List
  • Cuda 中未找到 HANDLE_ERROR 错误

    global void add int a int b int c c a b int main void int c int dev c HANDLE ERROR cudaMalloc void dev c sizeof int add
  • Sunspot / Solr / Rails:模型关联未在索引中更新

    我的应用程序中有一个 Fieldnote 模型 它通过名为 fieldnote activities 的表附加了 many activities 然后我这样定义一个可搜索索引 searchable auto index gt true au
  • 如何让 ASP.NET Web API(自托管)在 *仅* 本地主机上侦听?

    我正在按照这个例子here http www dotnetcurry com ShowArticle aspx ID 896用于自托管 ASP NET Web API 服务 但是 当在基地址中指定 localhost 作为主机时 它会被转换
  • 系列的第 n 项

    我们必须找到这个级数的第n项http oeis org A028859 http oeis org A028859 n 答案应该以 1000000007 为模 我已经编写了代码 但是当 n a 是一个巨大的数字时 时间限制就超出了 incl
  • 其他同步方法

    除了使用synchronized关键字之外 如何在java中同步方法 你可以使用java util concurrent locks封装 特别是Lock接口 Lock l l lock try access the resource pro
  • 在图像控制中以 5 秒时间间隔显示文件夹中的所有图像

    我有一个包含 1000 张图像的文件夹 图像名称的顺序为 ICON000 ICON001 直到 ICON 999 我需要它们以 5 秒的时间延迟按顺序显示在我的 WPF 图像控件中 我使用文件对话框来获取特定文件夹的路径和图像的相应前缀 图
  • JavaScript ES6 类可以与异步代码库一起使用吗?

    什么可以ES6 类 https developer mozilla org en US docs Web JavaScript Reference Classes作为一种组织模式 提供异步代码 下面是一个 ES7 async await 的
  • Bootstrap 导航栏边距

    我想让导航栏内容的左右边距变小 以便 品牌 最左侧的组件 在左侧显示得比默认值更多 右侧组件的情况也是如此 有人可以指出我要修改的相关较少变量吗 Thanks 对于基本布局 您想要的 CSS 选择器是 body gt navbar bran
  • PHP 在 foreach 中通过引用传递[重复]

    这个问题在这里已经有答案了 我有这个代码 a array zero one two three foreach a as v foreach a as v echo v PHP EOL 有人可以解释一下为什么输出是 零一二二 来自 zend
  • Android WebView 中的自定义视频播放器

    我研究了 Android 中的一些浏览器 当用户单击 Web 视图中的 html5 视频标记项时 他们可以使用自定义播放器播放视频 这个怎么做 更具体地说 当用户单击视频标签时 如何获取视频网址以及如何触发我的自定义播放器而不是 Andro
  • 如何在控制台应用程序中使用 TIdUDPServer?

    Indy UDP 服务器组件似乎依赖于 Windows 消息 因为我看到只有当鼠标光标移到包含服务器组件的表单上时才会出现新消息 我使用以下代码在运行时创建了该组件 private Private declarations Srv TIdU
  • SQL Server Compact Edition 是 SQLite 的明智替代品吗?

    除了 SQL Server Compact 中的文件大小限制和仅限 Windows 的使用之外 还有哪些区别 我找到了一个couple https stackoverflow com questions 2278104 sql ce sql
  • Windows 线程:_beginthread、_beginthreadex 与 CreateThread C++

    有什么更好的方式来启动一个线程 beginthread beginthreadx or CreateThread 我正在尝试确定什么是优点 缺点 beginthread beginthreadex and CreateThread 所有这些
  • 为什么 swagger 会引发不清楚的错误 - Django

    我有一个 django Rest 后端应用程序 我使用 swagger 来查看我的 api 并将其记录到 FE 这工作正常 但我做了一些更改 现在出现此错误 Internal Server Error Traceback most rece
  • 无法在 ubuntu 20.04 中安装 g++ 和 build-essentials

    即使在清洁后apt get clean它说有破损的包裹 sudo dpkg l grep r正如 1 中提到的 什么也不返回 sudo apt get install build essential Reading package list
  • MySQL配置不当原因:相对路径的不安全使用

    我正在使用 Django 当我运行时python manage py runserver我收到以下错误 ImproperlyConfigured Error loading MySQLdb module dlopen Library Pyt
  • 使用 Jasypt 和 PBKDF2WithHmacSHA1 密钥进行基于密码的 AES 加密

    我正在工作中实现加密机制 安全人员的要求如下 使用 PBKDF2WithHmacSHA512 秘密密码 256 位盐和最少 20000 次迭代创建 256 位密钥 盐应该使用 SecureRandom getInstance SHA1PRN