Encryptor类提供了构造对称加密器的工厂方法。使用此类,您可以创建字节密码器来加密原始字节[]形式的数据。您还可以构造文本加密程序来加密文本字符串。加密器是线程安全的。
35.2.1 BytesEncryptor
使用Encryptors.stronger
的工厂方法来构造字节密码器:
1 Encryptors.stronger("password", "salt");
“stronger”的加密方法使用伽罗瓦计数器模式的256位AES加密创建加密器。它使用PKCS #5的PBKDF2(基于密码的密钥导出函数#2)导出密钥。这个方法需要Java 6。用于生成密码的密码应保存在安全的地方,不得共享。salt用于在您的加密数据被泄露的情况下防止针对密钥的字典攻击。还应用了16字节的随机初始化向量,因此每个加密消息都是唯一的。
提供的salt应该是十六进制编码的字符串形式,是随机的,长度至少为8字节。这种盐可以使用密钥生成器生成:
1 String salt = KeyGenerators.string().generateKey(); // generates a random 8-byte salt that is then hex-encoded
用户也可以使用标准的加密方法,即密码块链接模式下的256位AES。这种模式不经过身份验证,也不能保证数据的真实性。对于一个更安全的选择,用户应该更喜欢加密器。
35.2.2 TextEncryptor
使用Encryptors.text工厂方法构建标准的文本加密器:
1 Encryptors.text("password", "salt");
文本加密程序使用标准的字节加密程序来加密文本数据。加密结果作为十六进制编码字符串返回,以便于存储在文件系统或数据库中。
使用Encryptors.queryableText工厂方法构造一个“可查询的”TextEncryptor:
1 Encryptors.queryableText("password", "salt");
可查询文本加密器和标准文本加密器的区别在于初始化向量(iv)处理。可查询的TextEncryptor #加密操作中使用的iv是共享的,或者是常量,并且不是随机生成的。这意味着多次加密的相同文本总是会产生相同的加密结果。这不太安全,但对于需要查询的加密数据是必要的。可查询的加密文本的一个例子是OAuth apiKey。