front end/javascript

javascript random number generation

노루아부지 2022. 8. 1. 21:36

Math.random()의 문제점

 

애플리케이션을 개발하다 보면 랜덤 하게 수를 생성(난수) 해야 하는 경우가 있습니다.

예전에는 일반적으로 javascript에서 random number를 생성할 때 Math.random()을 사용했습니다.

하지만 이 함수에는 문제가 있습니다.

MDN의 문서에 따르면 Math.random()은 암호학적으로 안전한 random number를 생성하지 않기 때문에 보안과 관련된 로직에서는 Math.random()을 사용하지 않는 것이 좋다고 합니다.

그래서인지 보안 취약점(시큐어 코딩) 프로그램을 실행하면 Math.random()이 취약점이라고 표시됩니다.

이러한 문제들 때문에 W3CWeb Crypto API를 만들어 공개했습니다.

이 기능은 대부분의 브라우저에서 사용할 수 있습니다.

 

 

Web Crypto API

 

브라우저에서 사용

Web Crypto API는 window.crypto를 통해 액세스 할 수 있는 다양한 암호화 관련 메서드와 함수를 제공합니다. 브라우저에서는 crypto.getRandomValues(Int32Array)를 사용하여 난수를 생성할 수 있습니다.

var array = new Uint32Array(10)
window.crypto.getRandomValues(array)

console.log('random numbers:')
for (var i = 0; i < array.length; i++) {
  console.log(array[i])
}

 

Nodejs에서 사용

한편 Nodejs에서는 require(’crypto’).randomBytes(size)를 사용하면 node에 있는 native 암호화 모듈을 사용하여 random number를 생성할 수 있습니다.

const randomBytes = require('crypto').randomBytes(2)
const number = parseInt(randomBytes.toString('hex'), 16)

console.log(number)

 

 

암호화 키로 사용

getRandomValues()는 crypto에서 유일하게 안전하지 않는 컨텍스트에서 사용할 수 있는 메서드입니다. 따라서 안전한 값이 아닐 수 있기 때문에 암호화 키를 생성할 때는 generateKey() 메서드를 사용하는 것이 좋습니다.

 

728x90
loading