시큐어코딩
- home
- 보안소식
- 시큐어코딩
20. [보안 기능] 중요정보 평문 저장
2019.04.30 10:05
안녕하세요, 지에스인포입니다.
오늘은 행안부 개발보안 가이드라인 47개 항목 중 "중요정보 평문 저장"이라는 항목에 대해 알아보겠습니다.
#중요정보 평문 저장 : "비밀번호, 개인정보 등의 중요정보를 암호화하여 저장하지 않아 정보가 노출 될 수 있는 보안약점"
대부분의 업무정보가 전산화 된 요즘, 많은 응용프로그램들은 메모리나 디스크에서 중요한 데이터(개인정보, 인증정보, 금융정보)를 저장하여 처리합니다. 그러나 프로그램이 개인정보, 인증정보 등의 사용자 중요정보 및 시스템 중요정보를 평문으로 저장할 경우 공격자에게 민감한 정보가 노출 될 수 있는 위험성이 있답니다.
따라서 개인정보(주민등록번호, 여권번호 등), 금융정보(카드번호, 계좌번호 등), 패스워드 등 중요정보를 저장 할 때는 반드시 암호화를 해서 저장해야 보안상의 위협을 방지 할 수 있습니다. 또한 중요정보를 읽거나 쓸 경우에도 권한인증 등을 통해 적합한 사용자가 접근 할 수 있도록 보안장치를 마련 해 주어야 하는데요.
이를 구현하기 위해선 설계단계에서부터 주요정보가 다뤄지는 "안전영역"을 설정하고 해당 영역 외부로 누출되지 않도록 해야 합니다. 또한 서버의 DB나 파일 등에 저장되는 중요정보는 반드시 암호화해서 저장하고, "암호연산" 보안요구항목에서 정의하고 있는 안전한 암호알고리즘과 암호키가 적용된 암호화 정책이 적용되어야 합니다.
특히 쿠키, HTML5 로컬저장소와 같은 클라이언트 측 하드 드라이브에는 중요정보가 저장되지 않도록 설계해야 하며, 부득이하게 중요정보를 저장해야 하는 경우에는 반드시 클라이언트 측에 저장되는 민감정보를 암호화해야 보안상의 취약점을 보완 할 수 있습니다. 또한 클라이언트 언어인 HTML 코드는 사용자에게 공개되어 있는 것과 마찬가지이므로 중요한 로직 및 주석처리는 서버측 언어에서만 처리되도록 설계하는 것 역시 기본이겠죠?
그러면 중요정보가 평문으로 저장되는 소스코드의 나쁜 사례를 직접 보시겠습니다.
위의 예제를 보시면 인증을 통과한 사용자의 패스워드 정보가 String 변수에 선언되어 그대로 DB에 insert 되는 것을 보실 수 있습니다. 이렇게 패스워드가 평문으로 DB에 저장된다면 해커가 DB에 접근하여 사용자들의 패스워드 정보를 알아 낼 위험성이 있겠지요?
그렇다면 이런 위협을 방지하려면 어떻게 해야 하는지, 함께 아래의 모범 답안을 보시겠습니다.
위의 사례에선 사용자의 패스워드 등의 중요 데이터를 먼저 String 변수에 넣은 뒤, getInstance 메소드를 통해 해시값으로 변환 한 뒤 DB에 전송 해 줍니다. 이렇게 중요정보가 암호화 된다면 만약 해커가 DB에 접근을 하더라도 패스워드 정보를 알아내기가 어려울테니 해킹의 위험성이 훨씬 줄어들게 됩니다.
실제로 소스코드를 보시니 그렇게 어렵지 않지요? 이렇게 중요 정보를 암호화 해서 저장하는 단계만 추가해도 보안성을 훨씬 향상 시킬 수 있다는 사실! 우리 모두 기억해 보아요~
위에 보시는 사례는 주요 정보가 암호화 되어 있지 않아 공격자에게 민감한 정보가 노출 된 경우입니다.
주요 정보를 암호화하여 저장 해 놓으면 공격자가 저장소에 접근하더라도 정보의 내용이 암호화가 되어있어 2차 피해를 예방할 수 있으니 중요정보는 꼭 암호화 저장, 반드시 해야겠죠?
지금까지 "중요정보 평문 저장"에 관한 항목을 살펴보았습니다. 다음 포스팅에서는 또 다른 항목과 알찬 내용으로 찾아뵙도록 하겠습니다.