Шифрование персональных данных в хранилище (AES-GCM)
This commit is contained in:
@@ -0,0 +1,18 @@
|
||||
package ru.pdguard;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.boot.test.context.SpringBootTest;
|
||||
import ru.pdguard.core.PayloadCipher;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
@SpringBootTest
|
||||
class CipherEnabledTest {
|
||||
@Autowired PayloadCipher cipher;
|
||||
|
||||
@Test
|
||||
void cipherIsEnabled() {
|
||||
assertTrue(cipher.enabled(), "шифрование должно быть включено ключом из конфигурации");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
package ru.pdguard;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import ru.pdguard.core.PayloadCipher;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertTrue;
|
||||
|
||||
/** Проверка ключа шифрования из application.yml. */
|
||||
class CipherKeyTest {
|
||||
|
||||
private static final String KEY = "46a38b200c6df557a5fd2c8a57ad3fec6b710b9f3e1fef1451d121a094f63573";
|
||||
|
||||
@Test
|
||||
void keyIsValidAes256() {
|
||||
PayloadCipher cipher = new PayloadCipher(KEY);
|
||||
assertTrue(cipher.enabled(), "ключ должен включать шифрование");
|
||||
String original = "Клиент Иванов Иван Иванович, паспорт 4509 123456";
|
||||
assertEquals(original, cipher.decrypt(cipher.encrypt(original)),
|
||||
"round-trip с ключом из application.yml должен работать");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
package ru.pdguard;
|
||||
|
||||
import org.junit.jupiter.api.Test;
|
||||
import ru.pdguard.core.PayloadCipher;
|
||||
import ru.pdguard.core.PayloadStore;
|
||||
|
||||
import static org.junit.jupiter.api.Assertions.assertEquals;
|
||||
import static org.junit.jupiter.api.Assertions.assertNotEquals;
|
||||
|
||||
/** Шифрование персональных данных в хранилище. */
|
||||
class PayloadCipherTest {
|
||||
|
||||
/** 32 байта в hex — валидный AES-256 ключ. */
|
||||
private static final String KEY = "000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f";
|
||||
|
||||
@Test
|
||||
void encryptDecryptRoundTrip() {
|
||||
PayloadCipher cipher = new PayloadCipher(KEY);
|
||||
String original = "Клиент Иванов Иван Иванович, паспорт 4509 123456";
|
||||
String encrypted = cipher.encrypt(original);
|
||||
assertNotEquals(original, encrypted, "шифротекст не должен совпадать с исходником");
|
||||
assertEquals(original, cipher.decrypt(encrypted), "должно расшифроваться обратно");
|
||||
}
|
||||
|
||||
@Test
|
||||
void disabledCipherPassesThrough() {
|
||||
PayloadCipher cipher = PayloadCipher.disabled();
|
||||
String original = "Клиент Иванов";
|
||||
assertEquals(original, cipher.encrypt(original), "без ключа шифрование выключено");
|
||||
assertEquals(original, cipher.decrypt(original), "без ключа дешифрование выключено");
|
||||
}
|
||||
|
||||
@Test
|
||||
void storeStoresEncryptedButReturnsPlaintext() {
|
||||
PayloadCipher cipher = new PayloadCipher(KEY);
|
||||
PayloadStore store = new PayloadStore(1_000_000L, 30, ru.pdguard.core.SharedIndex.disabled(), cipher);
|
||||
|
||||
String original = "Клиент Иванов Иван Иванович, паспорт 4509 123456";
|
||||
String masked = "Клиент И. И. И., паспорт 45** ****56";
|
||||
store.put("test", "id-1", original, masked);
|
||||
|
||||
// Чтение по id возвращает исходный текст.
|
||||
PayloadStore.Entry entry = store.byId("test", "id-1");
|
||||
assertEquals(original, entry.original(), "чтение по id должно вернуть исходный текст");
|
||||
|
||||
// Чтение по маске возвращает исходный текст.
|
||||
assertEquals(original, store.originalForMask("test", masked),
|
||||
"чтение по маске должно вернуть исходный текст");
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user