[시큐어코딩] FORBIDDEN.INSECURE_RANDOM 부적절한 난수 생성 처리

2023. 8. 29. 09:51웹/웹프로젝트

시큐어코딩을 돌렸을때

자바스크립트에서 Math.random() 관련 이슈가 발생했다.

 

 FORBIDDEN.INSECURE_RANDOM : 부적절한 난수 생성 : 부적절한 난수 생성 체커는 예측 가능한 난수를 사용하는 코드를 검출합니다.

 

위와 같이 이슈가 생성되었는데 JQUERY나 외부 라이브러리에서도 검출되어서 이를 에러 없이 변경하고 싶었다.

 

 

#Math.random()의 보안 취약점

Math.random()은 앞서 언급한 것처럼 보안적인 측면에서 단점이 있다. MDN의 문서에 따르면 Math.random()는 암호학적으로 안전한 난수를 생성해주지 않는다. 따라서 프로그램의 보안과 관련된 로직에서는 Math.random()을 사용하지 않는 것이 좋다.

Note: Math.random() does not provide cryptographically secure random numbers. Do not use them for anything related to security. Use the Web Crypto API instead, and more precisely the window.crypto.getRandomValues() method.

그 원인은 아래와 같다.

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

이러한 문제들 때문에, 월드와이드웹 컨소시움 Web Crypto API를 만들어 공개하였다. 이 기능은 대부분의 브라우저에서 사용할 수 있다.

 

참고:

 

Web Cryptography | Can I use... Support tables for HTML5, CSS3, etc

Many browsers support the [crypto.getRandomValues()](#feat=getrandomvalues) method, but not actual cryptography functionality under crypto.subtle.

caniuse.com

 

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

 

자바스크립트에서 안전하게 난수 생성하는 방법

Table of Contents Introduction 애플리케이션을 개발하다보면, 안전하게 난수를 생성해야 하는 경우가 있다. 예를 들어 주사위 게임이나 추첨, private key 생성 등등, 안전하게 난수를 생성하는 방법을 알

yceffort.kr

 

 

 

위의 블로그와 설명을 참고로 
window.crypto.getRandomValues 와

new Uint32Array 를 이용하여

난수를 생성할려고 하였는데 이를 기존에 사용하던 math.random처럼 영향이 안가게 소수로 표현할려고 소스를 수정하였다.

 

 

 

 

 

window.crypto.getRandomValues(new Uint32Array(10))[0]  // 난수를 생성하는 소스 결과값이 (483293292834 과 같이 정수로 나옴)

위의 난수를 생성하는 부분을 사용했을때 기존의 Math.random() 은 소수로 표현되는데 위의 결과 값은 소수로 나오지 않아 이상이 생길거 같아서 위를 소수로 표현하게 변경해주었다.
->>>최종!!!!!!

parseFloat("0."+window.crypto.getRandomValues(new Uint32Array(10))[0]);

위의 소스로 시큐어코딩에 안걸리고 정상 동작하는 것을 확인

이클립스에서 ctrl+ h 를 열고 File Search 부분의 replace를 이용해


Math.random()을 찾아서 변경해주었다.

 

 

반응형