1 简介
今天我们介绍一个 Java 库 - Jasypt, 全称为 Java Simplified Encryption, 用于加密解密. 它能够让开发者用花费最小的工作而把加密集成到项目中, 并且不需要对加密 / 解密有深入的了解.
通过 Maven 引用 jar 包如下:
- <dependency>
- <groupId>org.jasypt</groupId>
- <artifactId>jasypt</artifactId>
- <version>1.9.3</version>
- <scope>compile</scope>
- </dependency>
2 简单文本加密
文本加密是加密中最经常遇到的需求, 如通讯消息, 交易流水, 账号信息等, 这些都是非常敏感的信息, 许多场景下都需要加密储存, 然后读取展示的时候再解密. Jasypt 提供的 API 非常方便, 设置加密的密钥后, 就可以加密信息了, 代码如下:
- BasicTextEncryptor textEncryptor = new BasicTextEncryptor();
- // 设置加密密钥
- textEncryptor.setPassword("MySalt");
- // 加密信息
- String encryptedText = textEncryptor.encrypt("This is a secret message.");
- System.out.println("encryptedText:" + encryptedText);
- // 解密
- String decryptedText = textEncryptor.decrypt(encryptedText);
- System.out.println("decryptedText:" + decryptedText);
代码执行的结果为:
- encryptedText:S+j0ZQBxJloVi/qrEwvgnnu9tmeFMnJcmMoTY8wBhbLIdR2IFDt+Fw==
- decryptedText:This is a secret message.
3 单向密码加密
用户密码是极其敏感的信息, 不应该把密码明文储存在数据库中. 我们需要把密码明文进行加密处理后, 再把密文储存在数据库中. 当用户登陆时, 需要进行密码校验, 有两种方案: 一种方案是把数据库中的密文解密成明文, 再与用户输入的密码进行对比; 另一种方案是把用户输入的密码进行加密, 把加密后的密文与数据库的密文进行对比.
第二种方案是更合理的, 一方面是因为加密比解密更容易, 性能更好; 另一方面是减少明文出现的次数, 保证安全性. 第二种方案完全不需要解密, 所以我们只需要单向地密码加密便可以了. 以下代码展示这种场景下的应用:
- BasicPasswordEncryptor encryptor = new BasicPasswordEncryptor();
- // 加密密码
- String encryptedPassword = encryptor.encryptPassword("MyPassword");
- // 检查密码: 正确
- System.out.println(encryptor.checkPassword("MyPassword", encryptedPassword));
- // 检查密码: 错误
- System.out.println(encryptor.checkPassword("myPassword", encryptedPassword));
代码执行的结果为:
true false
4 改变加密算法
Jasypt 为我们提供的灵活的加密 / 解密操作, 可以自定义地使用不同的算法进行加密解密. 下面的代码例子展示了如何使用加密算法 PBEWithMD5AndTripleDES:
- StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
- // 设置密钥
- encryptor.setPassword("MySalt");
- // 设置加密算法
- encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
- // 加密信息
- String encryptedText = encryptor.encrypt("My secret message.");
- System.out.println("encryptedText:" + encryptedText);
- // 解密
- String decryptedText = encryptor.decrypt(encryptedText);
- System.out.println("decryptedText:" + decryptedText);
代码执行的结果为:
- encryptedText:fdNthKMZzNC5zeNO6b119njcKpqD/02EuGm2fsRs8+c=
- decryptedText:My secret message.
5 多线程解密
解密通常是比加密更难的过程, Jasypt 提供了多线程解密操作, 可以并行解密, 这样可以提供更好的性能. 一般建议可以设置与机器处理器核数一致的线程数进行解密. 代码如下:
- PooledPBEStringEncryptor encryptor = new PooledPBEStringEncryptor();
- // 设置线程数为 6
- encryptor.setPoolSize(6);
- // 设置密钥
- encryptor.setPassword("MySalt");
- // 设置算法
- encryptor.setAlgorithm("PBEWithMD5AndTripleDES");
- // 加密
- String encryptedText = encryptor.encrypt("My secret message.");
- System.out.println("encryptedText:" + encryptedText);
- // 解密
- String decryptedText = encryptor.decrypt(encryptedText);
- System.out.println("decryptedText:" + decryptedText);
代码执行结果为:
- encryptedText:wuZLTiEZ52O/nD2ktecPP75LRj+1Bu3s7YyfK8XcOc0=
- decryptedText:My secret message.
6 总结
本文介绍了一个优秀的 Java 加密库 Jasypt 的几种操作, 希望对大家在加密场景中有帮助. 另外, Jasypt 还能与其它框架进行整合, 如 Spring 和 Hibernate, 以后将为大家介绍.
来源: http://www.bubuko.com/infodetail-3327383.html