포시코딩

랜덤이 정말 랜덤일까? - Web Crypto API 본문

CS (Computer Science)

랜덤이 정말 랜덤일까? - Web Crypto API

포시 2022. 11. 22. 12:55
728x90

javascript를 쓰며 Math.random() 같은 형태로 랜덤 난수를 만들어 사용해본적이 있을 것이다. 

혹은 사다리타기나 당첨자 추첨을 할 때에도 컴퓨터를 통해 랜덤으로 뽑아본 경험이 있을 것이다. 

이 때 컴퓨터가 주는 랜덤 값은 과연 진짜 랜덤일까?

 

답은 '아니다'이다. 

 

컴퓨터는 입력한대로 결과를 뱉는 '계산기'라고 보면 된다. 

때문에 랜덤을 뱉게 하려면 'seed'를 통해 랜덤한 수에 근사하는 값을 만들게 해야하고 

여기서 'seed'로는 끊임없이 변화하는 '시간'이 사용되기도 한다. 

 

결론을 말하자면 컴퓨터는 완전한 랜덤숫자를 만들 수 없다. 

하지만, 예측이 불가능하다고 생각되는 랜덤숫자는 만들 수 있다.

 

그래서 컴퓨터에서 랜덤한 숫자를 줄 때 이것을 랜덤이라 하지 않고 pseudo(허상의) 랜덤이라고 부르는 것도 이 때문이다. 

 

대표적인 랜덤 생성 방법에는 두가지가 있다고 하는데

  1. 한 개 이상의 미리 정의된 난수 테이블이 존재하고 해당 난수 테이블 + 현재 시간에 기반해서 
    일정 규칙에 의해 값을 구해내는 방법
  2. 실시간 외부 노이즈를 사용하는 방법 ex) random.org

실시간 외부 노이즈는 폰 노이만도 사용했던 실제 자연에서의 소리나 컴퓨터 속 부품에서 나오는 소리들을 활용하여

랜덤하게 생기는 노이즈를 바탕으로 구하는 방법이다. 

하지만 이 경우도 완전한 랜덤이라고 볼 수는 없다.

환경과 장치를 똑같이 재현해내기만 한다면 랜덤이 아니게 되기 때문..

 

다시 돌아와서 그럼 우리가 쉽게 랜덤 값을 만드는 방법은 어떤게 있을까?

내가 자주 사용하는 언어인 javascript에서는 위에 나온 Math.random()을 자주 사용했었는데

알아보니 보안이슈 때문에 가급적 사용을 권하지 않고 있다고 한다. 

이유는 다음과 같다. 

  • 균일한 분포 내에서 랜덤 정수를 생성하는데 사용되는 로직이 부적절하고 일반적으로 편향되어 있음
  • 사용해야할 임의의 비트/바이트 수가 브라우저 별로 일치 하지 않음
  • 무작위 결과값은 항상 일관되게 다시 생성하기 어려우므로, 이는 본질적으로 비결정적이고 불규칙함
  • 빌트인 시드가 변조될 수 있으므로 무결성 측면에서 부적합

그래서 Web Crypto API를 사용하기를 권하고 있다.

 

Web Crypto API

대부분의 브라우저에서 사용할 수 있는 'Web Crypto API'는

'window.crypto'를 통해 엑세스할 수 있는 다양한 암호화 관련 메소드와 함수를 제공한다. 

Node.js에서도 표준 'Web Crypto API'가 제공된다. 

require('crypto').randomBytes(size)

위 코드를 통해 node에 있는 native 암호화 모듈을 사용하여 난수를 생성할 수 있다고 한다. 

자세한 정보는 아래 블로그에 친절히 나와있다.

https://yceffort.kr/2021/09/javascript-random-number

 

Home

yceffort

yceffort.kr

 

도움받은 링크

https://evan-moon.github.io/2019/07/14/what-is-random/

 

컴퓨터가 만드는 랜덤은 정말로 랜덤할까?

이번 포스팅에서는 에 대해서 한번 이야기 해볼까 한다. 랜덤이란 어떤 사건이 발생했을 때 이전 사건과 다음 사건의 규칙성이 보이지 않는, 말 그대로 로 발생하는 패턴을 이야기한다. 우리가

evan-moon.github.io

 

https://youtu.be/dzzryM3TtHk

 

728x90

'CS (Computer Science)' 카테고리의 다른 글

캐시(Cache)  (1) 2023.01.07
CPU  (0) 2023.01.07
Database, MongoDB  (0) 2022.12.13
API, RESTful API  (0) 2022.12.01
JIT vs AOT 컴파일 방식  (0) 2022.11.21