1. 암호화되지 않은 중요 정보 저정의 위험성
CWE-312는 비밀번호, 카드 번호, 개인 식별 정보(PII) 등 민감한 데이터가 하드디스크, 데이터베이스, 로그 파일 또는 구성 파일에 암호화되지 않은 상태(평문, Cleartext)로 저장될 때 발생합니다. 만약 공격자가 서버의 관리자 권한을 획득하거나, 백업 파일 탈취, 혹은 SQL 삽입 공격에 성공할 경우, 암호화되지 않은 정보는 즉시 심각한 2차 피해(계정 탈취, 금전적 손실 등)로 이어집니다.
2. 흔히 발생하는 취약한 패턴
개발 편의성이나 성능상의 이유로 보안을 간과할 때 주로 나타납니다.
• DB 평문 저장: 사용자 비밀번호나 주민등록번호를 별도의 암호화 처리 없이 VARCHAR 컬럼에 그대로 저장하는 경우.
• 설정 파일 노출: DB 접속 계정 정보나 API 키를 properties 파일에 평문으로 기록하는 경우.
• 로그 파일 정보 유출: 디버깅을 위해 사용자 객체를 통째로 로그로 남기면서 비밀번호 필드가 노출되는 경우.
• 임시 파일 및 캐시: 처리 과정에서 생성된 임시 파일에 민감 정보가 남는 경우.
3. 실무적 대응: 용도별 암호화 전략
저장되는 데이터의 성격에 따라 적절한 암호화 기법을 적용해야 합니다.
• 비밀번호(단방향 해시): 복구할 필요가 없는 비밀번호는 SHA-256 이상의 알고리즘에 **솔트(Salt)**를 추가하여 저장합니다.
• 개인정보(양방향 암호화): 복구가 필요한 카드 번호, 주소 등은 AES-256 이상의 안전한 알고리즘을 사용합니다.
• 설정 파일 암호화: Jasypt와 같은 라이브러리를 사용하여 설정 파일 내의 민감한 값들을 암호화합니다.
• 로그 마스킹: 로그 출력 시 민감한 필드는 *** 등으로 마스킹 처리하는 공통 로직을 적용합니다.
4. CWE-312 대응 및 안전한 데이터 저장 자바 코드 예시
코멘트: "공격자는 언젠가 우리 서버의 파일을 읽어갈 수 있다"는 전제하에 설계해야 합니다. 파일이나 DB를 열었을 때 데이터가 평문으로 보인다면 그것은 이미 보안 실패입니다. 특히 로그 파일에 민감 정보가 남지 않도록 주의 깊게 관리하십시오. logger.debug()를 통해 로직의 흐름은 기록하되, 그 속에 담긴 '데이터의 기밀성'은 암호화라는 단단한 자물쇠로 지켜내는 것이 시큐어 코딩의 핵심입니다.
댓글 달기