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를 만들어 공개하였다. 이 기능은 대부분의 브라우저에서 사용할 수 있다.
참고:
https://yceffort.kr/2021/09/javascript-random-number
위의 블로그와 설명을 참고로
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()을 찾아서 변경해주었다. |
'웹 > 웹프로젝트' 카테고리의 다른 글
[JAVA] 첨부파일 확장자 변경 후 파일 업로드시 변경 여부 체크 (0) | 2023.12.04 |
---|---|
웹프로젝트-4. -스프링부트- 에러페이지 만들기 (0) | 2019.09.10 |
웹프로젝트-3. -스프링부트- JSP 설정하기, Hello Word 출력 (0) | 2019.09.05 |
웹프로젝트-3. -스프링부트- 실행해보기 (0) | 2019.09.05 |
웹프로젝트-2. -DB (MySql)- 설치하기, database생성, user 생성 (0) | 2019.09.05 |