Модуль Spring Security Crypto обеспечивает поддержку симметричного шифрования, генерации ключа и кодирования пароля. Код распространяется как часть основного модуля, но не зависит ни от какого другого кода Spring Security (или Spring).
Это обеспечивает простую абстракцию для шифрования и, кажется, соответствует тому, что требуется здесь,
«Стандартный» метод шифрования - это 256-битный AES с использованием PKK # 5 PBKDF2 (на основе пароля). Функция получения ключа № 2). Этот метод требует Java 6. Пароль, используемый для генерации SecretKey, должен храниться в безопасном месте и не должен передаваться другим пользователям. Соль используется для предотвращения словарных атак на ключ в случае взлома ваших зашифрованных данных. 16-байтовый вектор случайной инициализации также применяется, поэтому каждое зашифрованное сообщение является уникальным.
Взгляд на внутренности показывает структуру, аналогичную ответу Эриксона .
Как отмечалось в этом вопросе, для этого также требуется Политика неограниченной юрисдикции Java Cryptography Extension (JCE) (иначе вы столкнетесь с InvalidKeyException: Illegal Key Size
). Его можно загрузить для Java 6 , Java 7 и Java 8 .
import org.springframework.security.crypto.encrypt.Encryptors;
import org.springframework.security.crypto.encrypt.TextEncryptor;
import org.springframework.security.crypto.keygen.KeyGenerators;
public class CryptoExample {
public static void main(String[] args) {
final String password = "I AM SHERLOCKED";
final String salt = KeyGenerators.string().generateKey();
TextEncryptor encryptor = Encryptors.text(password, salt);
System.out.println("Salt: \"" + salt + "\"");
String textToEncrypt = "*royal secrets*";
System.out.println("Original text: \"" + textToEncrypt + "\"");
String encryptedText = encryptor.encrypt(textToEncrypt);
System.out.println("Encrypted text: \"" + encryptedText + "\"");
// Could reuse encryptor but wanted to show reconstructing TextEncryptor
TextEncryptor decryptor = Encryptors.text(password, salt);
String decryptedText = decryptor.decrypt(encryptedText);
System.out.println("Decrypted text: \"" + decryptedText + "\"");
if(textToEncrypt.equals(decryptedText)) {
System.out.println("Success: decrypted text matches");
} else {
System.out.println("Failed: decrypted text does not match");
}
}
}
И пример вывода,
Salt: "feacbc02a3a697b0" Original text: "*royal secrets*" Encrypted text: "7c73c5a83fa580b5d6f8208768adc931ef3123291ac8bc335a1277a39d256d9a" Decrypted text: "*royal secrets*" Success: decrypted text matches