특정 컬럼 단위로 암호화를 수행하는 방식
예를 들어 사용자의 주민번호 등의 컬럼을 암호화
비밀번호의 경우 복호화가 불필요하기 때문에 해싱으로 처리
특정 컬럼만 암호화하여 선택적으로 보호가 가능
하지만 인덱싱이 불가능하고 암호화/복호화 비용이 발생
컬럼 암호화 적용 방식
MySQL 기준 AES_ENCRYPT() 사용
SQL 쿼리에서 암호화/복호화 수행
사용 예시
INSERT INTO users(name, ssn)
VALUES ('chobolevel', AES_ENCRYPT('123456-1234567', 'secret-password'));
SELECT name, AES_DECRYPT(ssn, 'secret-password') AS ssn FROM users;
코틀린 프로젝트 암호화 적용 예시
object AESUtil {
private const val SECRET = "secret-password"
private const val ALGORITHM = "AES"
private fun cipher(mode: Int): Cipher {
val keySpec = SecretKeySpec(SECRET.toByteArray(), ALGORITHM)
return Cipher.getInstance("AES").apply { init(mode, keySpec) }
}
fun encrypt(plainText: String): String {
val cipher = cipher(Cipher.ENCRYPT_MODE)
val encrypted = cipher.doFinal(plainText.toByteArray())
return Base64.getEncoder().encodeToString(encrypted)
}
fun decrypt(enryptedText: String): String {
val cipher = cipher(Cipher.DECRYPT_MODE)
val decoded = Base64.getDecoder().decode(encryptedText)
return String(cipher.doFinal(docoded))
}
}
// 사용 예시
val encryptedSsn: String = AESUtil.encrypt("123456-1234567")
val decryptedSsn: String = AESUtil.decrypt(encryptedSsn)
DB 파일 전체 또는 특정 블록 단위로 암호화하는 방식
디스크 탈취, 파일 복사 시 데이터 보호 가능
DB 레벨에서 암호화/복호화 해주기 때문에 코드 변경 거의 없으며 인덱싱 적용 가능
블록 암호화 적용 방식
MySQL 적용 예시
// 키 생성
INSTALL SONAME 'keyring_file';
SET GLOBAL keyring_file_data = '/var/lib/mysql-keyring/keyring';
// 암호화 적용 테이블 생성
CREATE TABLE condidential_data (
id INT PRIMARY KEY,
ssn VARCHAR(100)
) ENCRYPTION='Y';
// 암호화 여부 확인
SELECT TABLE_NAME, CREATE_OPTIONS FROM information_schema.tables
WHERE table_schema = '[schema_name]' AND create_options LIKE '$ENCRYPTION%';