관리 메뉴

코코야이야기

[시큐어코딩] 취약한 난수생성 - Math.random() 본문

프로그래밍/보안

[시큐어코딩] 취약한 난수생성 - Math.random()

코코야 2023. 3. 31. 13:31
반응형

* 취약점명
- Insecure Randomness

* Math.random
- 매우 예측하기 쉬운 알고리즘을 사용하여 만들어진 난수로, 보안적으로 안전하지 않음
- 내부적으로 seed 값을 생성하며, 이 값을 직접 지정할 수 없음
- 이 알고리즘은 시드 값이 변경되지 않는 한 항상 같은 순서의 난수 시퀀스를 생성하며, 같은 난수가 연속해서 발생할수 있으며 이론적으로 모든 값이 동일한 확률로 발생할 가능성이 있음
- 시드 값이 알려진 경우 다음에 생성될 난수를 예측할 수 있을 뿐만 아니라, 악의적인 사용자는 예측 가능한 난수 시퀀스를 생성하여 암호화된 데이터를 해독할 수 있음

* Math.random - seed 동적 생성
- Math.random() 함수로 발생하는 같은 난수 시퀀스를 완전히 제거할 수는 없지만, 초기 seed 값을 바꿔주면서 난수 시퀀스를 바꿀 수 있음
- 초기 seed 값을 고정하지 않고 현재 시간, 마우스 움직임, 키보드 입력 등의 다양한 값을 이용하여 seed 값을 생성하면, 보다 안전하게 사용할 수 있음

1. 현재 시간 이용

Math.seedrandom(new Date().getTime());

2. 마우스 움직임 이용

document.addEventListener('mousemove', function(e) {
  var x = e.clientX;
  var y = e.clientY;
  Math.seedrandom(x + y);
});

3. 키보드 입력 이용

document.addEventListener('keydown', function(e) {
  var key = e.keyCode;
  Math.seedrandom(key);
});



* Web Crypto API
- 대부분의 모바일 브라우저에서 지원
- 아래 코드에서는 window.crypto.getRandomValues() 메소드는 물리적인 entropy를 사용하여 난수를 생성
- 기기나 브라우저 내부에서 발생하는 무작위적인 외부 요소들(예: 마우스 이동, 키보드 입력, 하드웨어 센서 값 등)을 수집하여 진정한 난수를 생성
- crypto.getRandomValues()는 CSPRNG(암호학적으로 안전한 난수 생성기)를 사용하여 난수를 생성
- 이전에 생성된 난수를 이용해 다음 난수를 생성하는 알고리즘이 아닌, 외부 입력에 의존하여 생성하는 알고리즘을 사용하여 예측 불가능한 난수를 생성

function getRandomNum(from, to) {
  from = from || 1;
  to = to || 10;

  // Web Crypto API 지원 여부 확인
  if (typeof window.crypto === 'object' && typeof window.crypto.getRandomValues === 'function') {
    const range = to - from + 1;
    const bytes = new Uint8Array(1);
    let num;

    do {
      window.crypto.getRandomValues(bytes);
      num = bytes[0] / 255;
    } while (num >= range);

    return Math.floor(num * range + from);
  } else {
    // Web Crypto API 미지원 브라우저에서는 기존 로직 사용
    var num = Math.floor((Math.random() * to) + from);
    return num;
  }
}


* 기타 PRNG
- CryptoJS, sjcl(Secure JavaScript Cryptographic Library), Seedrandom 등
- 이 라이브러리들은 웹 브라우저 환경에서 동작하는 JavaScript 코드로 구현되어 있으며, 웹 브라우저 이외의 JavaScript 환경에서도 동작할 수 있음
- 이를 이용하여 Node.js와 같은 서버 사이드 JavaScript 환경에서도 안전한 난수를 생성할 수 있음

반응형

'프로그래밍 > 보안' 카테고리의 다른 글

사용자 식별 방법 - 세션  (0) 2023.04.03
[시큐어코딩] 접근제어  (1) 2019.07.01
[시큐어코딩] 쿠키 및 세션관리  (1) 2019.06.22
[시큐어코딩] 계정 및 인증관리  (0) 2019.06.18
Comments