AES (Advanced Encryption Standard) 加密是美國聯邦政府採用的對稱式加密標準,用來取代原先使用多年的 DES (Data Encryption Standard) 加密。Spring Security 提供一個命名為 Encryptors 的類別,可以進行 AES 加解密,說明如下。
- KeyGenerators
AES 加密需要 key 也需要 salt,這個工廠類別是密鑰產生器,產生出來的字串要當 key 或 salt 都可以,一般來說,key 會是人類取名,在必要時要求使用者需入,salt 則是系統產生,這個類別通常用來產生 salt。
如上圖,可以知道這個類別可以產生 BytesKeyGenerator 和 StringKeyGenerator 兩種密鑰產生器,BytesKeyGenerator 會產生 byte[] 的密鑰,StringKeyGenerator 則是 byte[] 的 hex 字串。secureRandom 不帶參數時,產生的密鑰長度是 8 bytes,要指定長度就帶參數。
程式寫法如下:
- String salt = KeyGenerators.string().generateKey();
- Encryptors
產生加密類別的工廠類別,宣告如下:
這個工廠類別會產生兩種加密類別 -- BytesEncryptor、TextEncryptor,這兩個類別都只有兩個 method - encrypt、descrypt,BytesEncryptor 的 method 傳入 byte[] 傳回 byte[],TextEncryptor 傳入 hex 值的字串,傳回 hex 值的字串。
如上,在 setUp()中產生 salt 及設定 password。testBytesEncryptor() 是測試 BytesEncryptor 的加解密,testTextEncryptor() 是測試 TextEncryptor 的加解密,testTextEncryptorAndBytesEncryptor() 則是驗證 TextEncryptor 產生的加密字串確實只是 hex 表示的字串。
- @ExtendWith(SpringExtension.class)
- @SpringBootTest
- @Slf4j
- class EncryptorsTest {
- private String salt = StringUtil.EMPTY;
- private String password = StringUtil.EMPTY;
- @BeforeEach
- void setUp() throws Exception {
- salt = KeyGenerators.string().generateKey();
- log.info("salt = " + salt);
- password = "P@ssw0rd";
- }
- @AfterEach
- void tearDown() throws Exception {
- }
- @Test
- void testBytesEncryptor() {
- BytesEncryptor encryptor = Encryptors.standard(password, salt);
- byte[] text = "習近平快GG了!".getBytes();
- byte[] encrypted = encryptor.encrypt(text);
- log.info(NumberUtil.toHex(encrypted));
- byte[] decrypted = encryptor.decrypt(encrypted);
- log.info(new String(decrypted));
- }
- @Test
- void testTextEncryptor() {
- TextEncryptor encryptor = Encryptors.text(password, salt);
- String encrypted = encryptor.encrypt("習近平快GG了!");
- log.info(encrypted);
- String decrypted = encryptor.decrypt(encrypted);
- log.info(decrypted);
- }
- @Test
- void testTextEncryptorAndBytesEncryptor() throws Exception {
- TextEncryptor textEncryptor = Encryptors.text(password, salt);
- String encrypted = textEncryptor.encrypt("習近平快GG了!");
- log.info(encrypted);
- BytesEncryptor bytesEncryptor = Encryptors.standard(password, salt);
- byte[] b = NumberUtil.hexToByte(encrypted);
- byte[] decryptedBytes = bytesEncryptor.decrypt(b);
- log.info(new String(decryptedBytes));
- }
- }
沒有留言:
張貼留言