Cert/소프트웨어(SW) 보안약점 진단원

설계단계 보안설계 기준 - 암호연산

브루노W 2024. 8. 26. 11:28
유형 보안기능
설계항목 암호연산
설명 국제표준 또는 검증필 암호모듈로 등재된 안전한 암호 알고리즘을 선정하고 충분한 암호키 길이, 솔트, 충분한 난수 값을 적용한 안전한 암호연산 수행방법을 설계한다.
보안대책 ① 대칭키 또는 비대칭키를 이용해서 암/복호화를 수행해야 하는 경우 한국인터넷진흥원의 '암호이용안내서'에서 정의하고 있는 암호화 알고리즘과 안전성이 보장되는 암호키 길이를 사용해야 한다.
② 복호화되지 않는 암호화를 수행하기 위해 해시함수를 사용하는 경우 안전한 해시 알고리즘과 솔트값을 적용하여 암호화해야 한다.
③ 난수 생성 시 안전한 난수 생성 알고리즘을 사용해야 한다.
연관된 구현단계 기준 취약한 암호화 알고리즘 사용
충분하지 않은 키 길이 사용
적절하지 않은 난수 값 사용
부적절한 인증서 유효성 검증
솔트 없이 일방향 해쉬 함수 사용

 

취약점 개요

 

사례1 : 취약한 암호알고리즘 사용

환경설정 파일에 저장된 비밀번호를 보호하기 위하여 base64와 같은 지나치게 간단한 인코딩 함수를 사용하면 비밀번호를 안전하게 보호할 수 없다.

 

 

사례2 : 충분하지 않은 키 길이 사용

검증된 암호화 알고리즘을 사용하더라도 키 길이가 충분히 길지 않으면 짧은 시간 안에 키를 찾아낼 수 있고 이를 이용해 공격자가 암호화된 데이터나 비밀번호를 복호화할 수 있게 된다.

 

 

사례3 : 적절하지 않은 난수 값 사용

예측 가능한 난수를 사용하는 것은 시스템의 보안약점을 유발한다.

 

 

사례4 : 솔트 없이 사용하는 일방향 해시함수

비밀번호 저장 시 일방향 해시함수의 성질을 이용하여 비밀번호의 해시값을 저장한다. 비밀번호를 솔트(salt)없이 해시하여 저장하면 공격자는 레인보우 테이블과 같이 가능한 모든 비밀번호에 대해 해시값을 미리 계산하고, 이를 이용한 전수조사로 비밀번호를 찾을 수 있게 된다.

 

 

 

설계 시 고려사항

 

① 대칭키 또는 비대칭키를 이용해서 암/복호화를 수행해야 하는 경우 한국인터넷진흥원의 '암호이용안내서'에서 정의하고 있는 암호화 알고리즘과 안전성이 보장되는 암호키 길이를 사용해야 한다.

 

 

 

 


② 복호화되지 않는 암호화를 수행하기 위해 해시함수를 사용하는 경우 안전한 해시 알고리즘과 솔트값을 적용하여 암호화해야 한다.

해시함수는 사용 목적에 따라 메시지인증/키 유도/난수 생성용과 단순 해시(메시지 압축)/전자 서명용으로 나눠며, 사용 목적과 보안강도에 따라 선택하여 이용한다.

 

 


③ 난수 생성 시 안전한 난수 생성 알고리즘을 사용해야 한다.

FIPS 140-2 인증을 받은 암호모듈의 난수 생성기와 256비트 이상의 시드를 사용하여 난수를 생성한다. 난수의 무작위성을 보장하기 위해 이전 난수생성 단계의 결과를 다음 난수생성 단계의 시드로 사용하는 의사난수생성기를 이용한다.

 

 

진단 세부사항

 

요구사항 ① 대칭키 또는 비대칭키를 이용해서 암/복호화를 수행해야 하는 경우 한국인터넷진흥원의 '암호이용안내서'에서 정의하고 있는 암호화 알고리즘과 안전성이 보장되는 암호키 길이를 사용해야 한다.

- 안전한 암호화 알고리즘과 안전성이 보장되는 암호키 길이를 사용하도록 설계되어 있는지 확인

 . 대칭키 암호화 알고리즘 : SEED, ARIA, AES 등 (키 길이 128 비트 이상)

 . 비대칭키 암호화 알고리즘 : RSA, KCDSA, ECC 등 (키 길이 2,048 비트 이상)

 

요구사항 ② 복호화되지 않는 암호화를 수행하기 위해 해시함수를 사용하는 경우 안전한 해시 알고리즘과 솔트값을 적용하여 암호화해야 한다.

- 일방향 암호화 수행을 위한 해시함수 사용 방법이 안전하게 설계되어 있는지 확인

 . SHA-2 계열(SHA-224, SHA-256, SHA-384, SHA-512)

- 해시함수로 암호화된 데이터 크랙을 점검하는 테스트 계획이 수립되어 있는지 확인

 

요구사항 ③ 난수 생성 시 안전한 난수 생성 알고리즘을 사용해야 한다.

- 난수 생성을 위해 안전한 난수 생성 알고리즘을 사용하도록 설계되어 있는지 확인

 . Java 프로그램 개발 : java.security.SecureRandom, java.util.Random과 같은 안전한 API 사용

 . C 프로그램 개발 : randomize(seed) 함수

- 생성된 난수의 안전성을 점검하는 테스트 계획이 수립되어 있는지 확인