Contents

Jasypt 介绍

1. 概述

在本文中,我们将研究*Jasypt * (Java 简化加密)库。 Jasypt 是一个 Java 库,它允许开发人员以最小的努力将基本的加密功能添加到项目中,而无需深入了解加密协议的实现细节。

2. 使用简单加密

考虑我们正在构建一个用户提交帐户私有数据的 Web 应用程序。我们需要将该数据存储在数据库中,但存储纯文本是不安全的。 处理它的一种方法是将加密的数据存储在数据库中,并在为特定用户检索该数据时对其进行解密。 要使用非常简单的算法执行加密和解密,我们可以使用 Jasypt 库中的*BasicTextEncryptor * 类:

BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
String privateData = "secret-data";
textEncryptor.setPasswordCharArray("some-random-data".toCharArray());

然后我们可以使用*encrypt()*方法来加密明文:

String myEncryptedText = textEncryptor.encrypt(privateData);
assertNotSame(privateData, myEncryptedText);

如果我们想在数据库中存储给定用户的私有数据,我们可以存储一个myEncryptedText而不会违反任何安全限制。如果我们想将数据解密回纯文本,我们可以使用*decrypt()*方法:

String plainText = textEncryptor.decrypt(myEncryptedText);
 
assertEquals(plainText, privateData);

我们看到解密的数据等于之前加密的纯文本数据。

3. 单向加密

前面的示例不是执行身份验证的理想方式,即当我们要存储用户密码时。理想情况下,我们希望加密密码而不用解密它。当用户尝试登录我们的服务时,我们会加密他的密码并将其与存储在数据库中的加密密码进行比较。这样我们就不需要对纯文本密码进行操作了。 我们可以使用BasicPasswordEncryptor类来执行单向加密:

String password = "secret-pass";
BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(password);

然后,我们可以将已经加密的密码与执行登录过程的用户的密码进行比较,而无需解密已经存储在数据库中的密码:

boolean result = passwordEncryptor.checkPassword("secret-pass", encryptedPassword);
assertTrue(result);

4. 配置加密算法

我们可以使用更强的加密算法,但我们需要记住为我们的 JVM 安装Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files (安装说明包含在下载中)。 在 Jasypt 中,我们可以通过使用StandardPBEStringEncryptor类来使用强加密,并使用*setAlgorithm()*方法对其进行自定义:

StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
String privateData = "secret-data";
encryptor.setPassword("some-random-passwprd");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

让我们将加密算法设置为PBEWithMD5AndTripleDES。 接下来,使用BasicTextEncryptor类的加密和解密过程看起来与上一个相同:

String encryptedText = encryptor.encrypt(privateData);
assertNotSame(privateData, encryptedText);
String plainText = encryptor.decrypt(encryptedText);
assertEquals(plainText, privateData);

5. 使用多线程解密

当我们在多核机器上运行时,我们希望并行处理解密。为了获得良好的性能,我们可以使用*PooledPBEStringEncryptor * 和setPoolSize() API 创建一个消化池。它们中的每一个都可以由不同的线程并行使用:

PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
encryptor.setPoolSize(4);
encryptor.setPassword("some-random-data");
encryptor.setAlgorithm("PBEWithMD5AndTripleDES");

将池大小设置为等于机器的核心数是一种很好的做法。加解密的代码和前面的一样。

6. 在其他框架中的使用

最后要注意的是,Jasypt库可以与许多其他库集成,当然包括Spring框架。 我们只需要创建一个配置来将加密支持添加到我们的 Spring 应用程序中。如果我们想将敏感数据存储到数据库中,并且我们使用Hibernate作为数据访问框架,我们也可以将Jasypt与其集成。 有关这些集成以及其他一些框架的说明,可以在Jasypt 主页上 的“指南”部分找到。