Jasypt入门

发布时间 2023-06-02 20:29:57作者: shigp1

Jasypt是一个java库,它允许开发人员以最小的工作量为他/她的项目添加基本的加密功能,而不需要对密码学的工作原理有深入的了解。

一、特性

  • Jasypt为您提供了简单的单向(摘要)和双向加密技术。

  • 用于任何 JCE 提供程序的开放 API,而不仅仅是默认的 Java VM 提供程序。 Jasypt 可以很容易地与 Bouncy Castle 等知名提供商一起使用。

  • 提高用户密码的安全性。

  • 二进制加密支持。Jaypt允许对二进制文件(字节数组)进行摘要和加密。在需要时对您的对象或文件进行加密(例如,用于通过网络发送)。

  • 数字加密支持。除了文本和二进制文件,它还允许对数值进行摘要和加密(BigInteger和BigDecimal,为Hibernate持久性加密时支持其他数字类型)。

  • 完全线程安全。

  • 支持加密器/摘要池,以便在多处理器/多核系统中实现高性能。

  • 包括库的轻量级(“lite”)版本,以便在移动平台等限制大小的环境中实现更好的可管理性。

  • 为刚接触加密的用户提供简单、无配置的加密工具,也为高级用户提供高度可配置的标准加密工具。

  • Hibernate 3、4和5可选集成,用于以加密方式持久化映射实体的字段。字段的加密是在Hibernate映射文件中定义的,它对应用程序的其余部分保持透明(对敏感的个人数据、具有许多启用读取的用户的数据库有用…)。加密文本、二进制文件、数字、布尔值、日期。。。

  • 可无缝集成到Spring应用程序中,具有针对Spring 2、Spring 3.0、Spring 3.1和Spring 4.0的特定集成功能。jasypt中的所有消化器和加密器都设计为可以从Spring轻松使用(实例化、注入依赖项…)。而且,由于它们是线程安全的,因此可以在像Spring这样的面向单例的环境中使用,而不必担心同步问题。

  • Spring Security(前身为Acegi Security)可选集成,用于为安全框架执行密码加密和匹配任务,通过使用更安全的密码加密机制提高用户密码的安全性,并为您提供更高程度的配置和控制。

  • 提供高级功能,用于加密应用程序的全部或部分配置文件,包括数据库密码等敏感信息。将加密配置无缝集成到普通的、基于Spring和/或支持Hibernate的应用程序中。

  • 提供易于使用的CLI(命令行界面)工具,允许开发人员初始化其加密数据,并在维护任务或脚本中包括加密/解密/摘要操作。

  • 集成到Apache Wicket中,在您的安全应用程序中对URL进行更强大的加密。

  • 全面的指南和javadoc文档,使开发人员能够更好地了解他们对数据的实际操作。

  • 强大的字符集支持,旨在充分加密和摘要文本,无论原始字符集是什么。完全支持日语、韩语、阿拉伯语等语言。。。没有编码或平台问题。

  • 非常高级别的配置功能:开发人员可以实现一些技巧,例如指示“加密器”向远程HTTPS服务器询问用于加密的密码。它可以满足您的安全需求。

二、使用

这里用SpringBoot演示Jasypt。添加依赖:

 <dependency>
        <groupId>com.github.ulisesbocchio</groupId>
        <artifactId>jasypt-spring-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>

使用Jasypt最简单的方法是使用其简单的加密工具,这些工具被称为utils,因为它们位于org.asypt.util包中。

它们之所以被称为utils,是因为它们是现成的、预配置的摘要和加密器,可以在不了解其配置的情况下使用。

这些实用工具根据其打算执行的任务进行分类:

  • 通用摘要(org.jasypt.util.destist.*)

  • 密码加密(org.jasypt.util.Password.*)

  • 文本加密(org.jasypt.util.Text.*)

  • 数字加密(org.jasypt.util.Number.*)

  • 二进制加密(org.jasypt.util.Binary.*)

通用摘要

org.jasypt.util.digest.Digester:它在二进制级别执行消息摘要,并且其结果与从java.security.MessageDigest对象获得的结果等效,尽管是以线程安全的方式操作的,并且实现了更适合在以bean为中心的环境中使用的接口。

@Test
public void test1() {
    String message = "123";
    Digester digester = new Digester();
    digester.setAlgorithm("SHA-1");
    byte[] digest = digester.digest(message.getBytes(StandardCharsets.UTF_8));
    System.out.println(new String(digest, StandardCharsets.UTF_8));
}

密码加密

这里的所有类都实现了org.asypt.util.password.PasswordEncryptor接口,因此如果需要,它们可以互换使用。

org.jasypt.util.password.BasicPasswordEncryptor它既可以用于在用户注册时加密密码,也可以用于在登录时检查输入密码。

BasicPasswordEncryptor passwordEncryptor = new BasicPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
...
if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
  // correct!
} else {
  // bad login!
}

org.jasypt.util.password.StrongPasswordEncryptor其实现了比PasswordEncryptor高得多的密码安全性(以更高的计算成本)。

StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
...
if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
  // correct!
} else {
  // bad login!
}

org.jasypt.util.password.ConfigurablePasswordEncryptor这允许开发人员决定要使用的算法,以及他/她是否希望应用完整的安全密码加密机制。

ConfigurablePasswordEncryptor passwordEncryptor = new ConfigurablePasswordEncryptor();
passwordEncryptor.setAlgorithm("SHA-1");
passwordEncryptor.setPlainDigest(true);
String encryptedPassword = passwordEncryptor.encryptPassword(userPassword);
...
if (passwordEncryptor.checkPassword(inputPassword, encryptedPassword)) {
  // correct!
} else {
  // bad login!
}

文本加密

这里的所有类都实现了org.asypt.util.text.TextEncryptor接口,因此如果需要,它们可以互换使用。

org.jasypt.util.text.BasicTextEncryptor这允许用户使用普通强度算法对文本数据进行加密和解密。为了能够加密和解密,这个加密器必须首先设置密码。

BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);
...
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);

org.jasypt.util.text.StrongTextEncryptor这允许用户使用高强度算法对文本数据进行加密和解密。(可能需要下载并安装Java加密扩展(JCE)Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files才能使用它)。为了能够加密和解密,这个加密器必须首先设置密码。

StrongTextEncryptor textEncryptor = new StrongTextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);
...
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);

更安全:具有更安全算法的AES256TextEncryptor util类:PBEWithHMACSHA512AndAES_256(您至少需要Java 8才能使用它):

AES256TextEncryptor textEncryptor = new AES256TextEncryptor();
textEncryptor.setPassword(myEncryptionPassword);
...
String myEncryptedText = textEncryptor.encrypt(myText);
...
String plainText = textEncryptor.decrypt(myEncryptedText);

数字加密

这里的所有类都实现了org.asypt.util.numeric.DecimalNumberEncryptororg.asypt.util.numeric.IntegerNumberEncrypter接口,因此如果需要,它们可以互换使用。

org.jasypt.util.numeric.BasicIntegerNumberEncryptor这允许用户使用普通强度算法对BigInteger对象进行加密和解密。为了能够加密和解密,这个加密器必须首先设置密码。

BasicIntegerNumberEncryptor integerEncryptor = new BasicIntegerNumberEncryptor();
integerEncryptor.setPassword(myEncryptionPassword);
...
BigInteger myEncryptedNumber = textEncryptor.encrypt(myNumber);
...
BigInteger plainNumber = textEncryptor.decrypt(myEncryptedNumber);

org.jasypt.util.numeric.StrongIntegerNumberEncryptor这允许用户使用高强度算法对BigInteger对象进行加密和解密。(可能需要下载并安装Java加密扩展(JCE)Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files才能使用它)。为了能够加密和解密,这个加密器必须首先设置密码。

StrongIntegerNumberEncryptor integerEncryptor = new StrongIntegerNumberEncryptor();
integerEncryptor.setPassword(myEncryptionPassword);
...
BigInteger myEncryptedNumber = integerEncryptor.encrypt(myNumber);
...
BigInteger plainNumber = integerEncryptor.decrypt(myEncryptedNumber);

更安全:具有更安全算法的AES256DecimalNumberEncryptor util类:PBEWithHMACSHA512AndAES_256(至少需要Java 8才能使用它):

BigInteger myNumber = ...;
...
AES256IntegerNumberEncryptor numberEncryptor = new AES256IntegerNumberEncryptor();
numberEncryptor.setPassword(myEncryptionPassword);
...
BigInteger myEncryptedNumber = numberEncryptor.encrypt(myNumber);
...
BigInteger plainNumber = numberEncryptor.decrypt(myEncryptedNumber);

org.jasypt.util.numeric.BasicDecimalNumberEncryptor这允许用户使用普通强度算法对BigDecimal对象进行加密和解密。为了能够加密和解密,这个加密器必须首先设置密码。

BasicDecimalNumberEncryptor decimalEncryptor = new BasicDecimalNumberEncryptor();
decimalEncryptor.setPassword(myEncryptionPassword);
...
BigDecimal myEncryptedNumber = decimalEncryptor.encrypt(myNumber);
...
BigDecimal plainNumber = decimalEncryptor.decrypt(myEncryptedNumber);

org.jasypt.util.numeric.StrongDecimalNumberEncryptor这允许用户使用高强度算法对BigDecimal对象进行加密和解密。(可能需要下载并安装Java加密扩展(JCE)Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files才能使用它)。为了能够加密和解密,这个加密器必须首先设置密码。

StrongDecimalNumberEncryptor decimalEncryptor = new StrongDecimalNumberEncryptor();
decimalEncryptor.setPassword(myEncryptionPassword);
...
BigDecimal myEncryptedNumber = decimalEncryptor.encrypt(myNumber);
...
BigDecimal plainNumber = decimalEncryptor.decrypt(myEncryptedNumber);

更安全:具有更安全算法的AES256DecimalNumberEncryptor util类:PBEWithHMACSHA512AndAES_256(至少需要Java 8才能使用它):

BigDecimal myNumber = ...;
...
AES256DecimalNumberEncryptor numberEncryptor = new AES256DecimalNumberEncryptor();
numberEncryptor.setPassword(myEncryptionPassword);
...
BigDecimal myEncryptedNumber = numberEncryptor.encrypt(myNumber);
...
BigDecimal plainNumber = numberEncryptor.decrypt(myEncryptedNumber);

二进制加密

这里的所有类都实现了org.asypt.util.binary.BinaryEncryptor接口,因此如果需要,它们可以互换使用。

org.jasypt.util.binary.BasicBinaryEncryptor这允许用户使用普通强度算法对byte[]对象进行加密和解密。为了能够加密和解密,这个加密器必须首先设置密码。

BasicBinaryEncryptor binaryEncryptor = new BasicBinaryEncryptor();
binaryEncryptor.setPassword(myEncryptionPassword);
...
byte[] myEncryptedBinary = binaryEncryptor.encrypt(myBinary);
...
String plainBinary = binaryEncryptor.decrypt(myEncryptedBinary);

org.jasypt.util.binary.StrongBinaryEncryptor这允许用户使用高强度算法对byte[]对象进行加密和解密。(可能需要下载并安装Java加密扩展(JCE)Java Cryptography Extension (JCE) Unlimited Strength Jurisdiction Policy Files才能使用它)。为了能够加密和解密,这个加密器必须首先设置密码。

StrongBinaryEncryptor binaryEncryptor = new StrongBinaryEncryptor();
binaryEncryptor.setPassword(myEncryptionPassword);
...
byte[] myEncryptedBinary = binaryEncryptor.encrypt(myBinary);
...
String plainBinary = binaryEncryptor.decrypt(myEncryptedBinary);

更安全:AES256BinaryEncryptor util类具有更安全的算法:PBEWithHMACSHA512AndAES_256(您至少需要Java 8才能使用它):

AES256BinaryEncryptor binaryEncryptor = new AES256BinaryEncryptor();
binaryEncryptor.setPassword(myEncryptionPassword);
...
byte[] myEncryptedBytes = binaryEncryptor.encrypt(myBytes);
...
byte[] plainBytes = binaryEncryptor.decrypt(myEncryptedBytes);