본문 바로가기
공부/KISA

적절하지 않은 난수값 사용 - KISA 소프트웨어 개발 보안 가이드

by Skogkatt의 개인 블로그 2020. 7. 21.
반응형

https://www.kisa.or.kr/public/laws/laws3.jsp

 

기술안내서 가이드 < 관련법령·기술안내서 < 자료실 : 한국인터넷진흥원

기술안내서 가이드 한국인터넷진흥원 기술안내서 가이드 입니다. 게시판 목록 보기 기술안내서 가이드 표 대분류 소분류 기술안내서 가이드 대상 수준 인터넷 진흥 및 이용 활성화 인터넷 진흥

www.kisa.or.kr


구현 단계 시큐어코딩 가이드 - 보안 기능 - 적절하지 않은 난수 값 사용

가. 개요

  • 예측 가능한 난수를 사용하는 것은 시스템에 보안약점을 유발한다. 예측 불가능한 숫자가 필요한 상황에서 예측 가능한 난수를 사용한다면, 공격자는 SW에서 생성되는 다음 숫자를 예상하여 시스템을 공격하는 것이 가능하다.

나. 보안대책

  • 컴퓨터의 난수발생기는 난수 값을 결정하는 시드(Seed) 값이 고정될 경우, 매번 동일한 난수 값이 발생한다. 이를 최대한 피하기 위해 Java에서는 Random()과 Math.random() 사용 시 java.util.Random 클래스에서 기본값으로 현재시간을 기반으로 조합하여 매번 변경되는 시드(Seed) 값을 사용하며, C에서는 rand() 함수 사용 시 매번 변경되는 기본 시드(Seed) 값이 없으므로, srand()를 통해 매번 변경되는 현재시간 기반 등으로 시드(Seed) 값을 설정하여야 한다.
  • 그러나 세션 ID, 암호화키 등 보안 결정을 위한 값을 생성하고 보안 결정을 수행하는 경우에는, Java에서 Random()과 Math.random()을 사용하지 말아야 하며, 예측이 거의 불가능하게 암호학적으로 보호된 java.security.SecureRandom 클래스를 사용하는 것이 안전하다.

다. 코드예제

JAVA
더보기

java.util.Random 클래스의 random() 메소드 사용 시, 고정된 seed를 설정하면 동일한 난수 값이 생성되어 안전하지 않다. 매번 변경되는 seed를 설정하더라도 보안 결정을 위한 난수 이용 시에는 안전하지 않다.

java.util.Random 클래스는 setSeed를 통해 매번 변경되는 시드 값을 설정하거나, 현재 시간 기반으로 매번 변경되는 별도 seed를 설정하지 않는 기본값을 사용한다. 보안 결정을 위해 난수 사용 시에는 java.security.SecureRandom 클래스를 사용하는 것이 보다 안전하다. 

 

C#
더보기

보안결정을 위한 난수로는 안전하지 않은 C# 코드의 예제이다.

암호학적으로 보호된 SecureRandom을 사용한다.

 

C
더보기

Seeding 없이 사용하는 rand() 함수는 암호화에 사용되기 힘듭니다.

srandom(), random() 함수를 사용하면 보안적으로 안전한 난수를 얻을 수 있다.


참고자료

반응형

댓글