본문 바로가기
Cert/소프트웨어(SW) 보안약점 진단원

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

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

 

취약점 개요

 

사례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) 함수

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