보안 공부/소스코드 보안약점 진단

소스코드 보안약점 진단 - 솔트 없이 일방향 해시함수 사용

H.J.World 2022. 1. 19. 10:10
728x90
반응형

소스코드 보안약점 진단 // 소프트웨어 보안약점 진단 // SW 보안약점 진단과 같이 다양한 이름으로 불리는 진단 과업 중 하나이다.

SW개발보안은 해킹 등 사이버공격의 원인인 보안약점을 SW개발단계에서 사전에 제거하고 SW 개발 생명주기의 각 단계별로 수행하는 일련의 보안활동을 통하여 안전한 SW를 개발·운영하기 위한 목적으로 적용하는 개발체계이다.

해당 내용은 KISA에서 발간하는 취약점 진단 가이드 항목을 기준으로 작성한다.

 

제2절 보안기능

보안기능(인증, 접근제어, 기밀성, 암호화, 권한관리 등)을 부적절하게 구현시 발생할 수 있는 보안 약점으로 적절한 인증 없는 중요기능 허용, 부적절한 인가 등이 포함된다.


14. 솔트 없이 일방향 해시함수 사용

가. 개요

패스워드를 저장시 일방향 해시함수의 성질을 이용하여 패스워드의 해시값을 저장한다. 만약 패스 워드를 솔트(Salt)없이 해시하여 저장한다면, 공격자는 레인보우 테이블과 같이 해시값을 미리 계산 하여 패스워드를 찾을 수 있게 된다.

나. 보안대책

패스워드를 저장시 패스워드와 솔트를 해시함수에 함께 입력하여 얻은 해시값을 저장한다.

다. 코드예제

다음의 예제는 패스워드 저장 시 솔트 없이 패스워드에 대한 해쉬값을 얻는 과정을 보여준다.

- 안전하지 않은 코드의 예 JAVA -

1: public String getPasswordHash(String password) throws Exception {
2: MessageDigest md = MessageDigest.getInstance("SHA-256");
//해쉬에 솔트를 적용하지 않아 안전하지 않다.
3: md.update(password.getBytes());
4: byte byteData[] = md.digest();
5: StringBuffer hexString = new StringBuffer();
6: for (int i=0; i<byteData.length i++) {
7: String hex=Integer.toHexString(0xff & byteData[i]);
8: if (hex.length() == 1) {
9: hexString.append('0');
10: }
11: hexString.append(hex);
12: }
13: return hexString.toString();
14: }

 

- 안전한 코드의 예 JAVA -

패스워드만을 해쉬함수의 입력으로 사용하기에 레인보우 테이블을 이용한 사전 공격이 가능하며, 이를 방지하기 위해 패스워드와 솔트를 함께 해쉬함수에 적용하여 사용한다.

1: public String getPasswordHash(String password, byte[] salt) throws Exception {
2: MessageDigest md = MessageDigest.getInstance("SHA-256");
3: md.update(password.getBytes());
//해시사용시에는 원문을 찾을 수 없도록 솔트를 사용하여야한다.
4: md.update(salt);
5: byte byteData[] = md.digest();
6: StringBuffer hexString = new StringBuffer();
7: for (int i=0; i<byteData.length i++) {
8: String hex=Integer.toHexString(0xff & byteData[i]);
9: if (hex.length() == 1) {
10: hexString.append('0');
11: }
12: hexString.append(hex);
13: }
14: return hexString.toString();
15: }

 

라. 진단방법

getInstance 함수로 안전한 해쉬 알고리즘을 인자로 하여 MessageDigest 객체를 생성하는지 확인 하고(①), 해쉬 값을 반환(②) 하기 전에 update 함수에 솔트를 사용하여 데이터를 해쉬하는지 확인한다.

다음의 예제에서는 MessageDigest 객체를 생성하고 솔트 없이 해쉬 값을 반환하고 있으므로 취약 하다고 판정한다.

1: MessageDigest digest = MessageDigest.getInstance(“SHA-512”);---------①
2: digest.reset();
3: return digest.digest(password.getBytes(“UTF-8”));-------------------②

 

728x90
반응형