소나 큐브를 처음 써보는데 검사 결과 목록 중 바로 아래 그림과 같은 결과가 있었다.
뭔가 봤더니 인증 코드 생성하는 부분에서 Random()으로 생성하는 게 좋지 않다고 적혀있었다.
자세히 설명을 읽어보자.
When software generates predictable values in a context requiring unpredictability, it may be possible for an attacker to guess the next value that will be generated, and use this guess to impersonate another user or access sensitive information.
As the java.util.Random class relies on a pseudorandom number generator, this class and relating java.lang.Math.random() method should not be used for security-critical applications or for protecting sensitive data. In such context, the java.security.SecureRandom class which relies on a cryptographically strong random number generator (RNG) should be used in place.
간단히 요약하자면 java.util.Random은 유사 난수 생성기 이고 java.security.SecureRandom은 암호학적으로 강한 난수 생성기이니 SecureRandom을 사용하는 말이다.
유사 난수(pseudorandom)
진짜 난수가 생성되는 것이 아닌, 난수처럼 보이기 위해 알고리즘을 통해 규칙적으로 생성된 난수
랜덤처럼 보이기 위해 여러 개의 난수표을 만들어 놓고 매번 다른 난수표를 읽어서 생성하는 것이다.
이때, 난수표를 선택하는 것을 시드라고 하는데 시드 값이 똑같다는 것은 같은 난수표를 선택했다는 말이다.
선택한 난수표를 알게 되면 계산을 통해 생성될 난수를 알 수 있기 때문에 시드값도 난수여야 한다.
보통 시드 값을 시간으로 지정하는 것이 기본값으로 공격자가 시드 생성시간을 알고 있으면 위험할 수 있다.
Random rand = new Random (); // seed = System.nanoTime()
크기 | 코드 깨기 시도 | 사용하는 시드 | 생성 기능 | |
Random() | 최대 48비트 | 2^48번 시도해야 함. | 시스템 시간 | Oracle JDK 7 기준 Congruential Generator를 사용하여 임의의 값 생성 |
SecureRandom() | 최대 128비트 | 2^128번 시도해야 함. | OS의 임의 데이터 | SHA1PRNG 알고리즘 |
이런 이유로 SecureRandom()으로 바꿨다.
추가로 소나큐브에서 How can you fix it?에 적어 놓은 것을 한 번만 더 읽어보자.
Recommended Secure Coding Practices
- Use a cryptographically strong random number generator (RNG) like "java.security.SecureRandom" in place of this PRNG.
- Use the generated random values only once.
- You should not expose the generated random value. If you have to store it, make sure that the database or file is secure.
참고링크
https://docs.oracle.com/en/java/javase/11/docs/api/java.base/java/security/SecureRandom.html
https://velog.io/@dudwls0505/%EC%9E%90%EB%B0%94%EC%9D%98-%EB%82%9C%EC%88%98%EC%83%9D%EC%84%B1%EA%B8%B0-Random-SecureRandom
https://kdhyo98.tistory.com/48
'버그리포트' 카테고리의 다른 글
[버그 리포트] access token 재발급 무한 요청 문제 (0) | 2024.05.07 |
---|---|
[SonarQube 06] JUnit 5에서는 Test class에 접근제한자 붙이지 말기 (0) | 2023.04.27 |
[SonarQube 05] 길이가 늘어나는 문자열은 String 대신 StringBuilder를 쓰자. (0) | 2023.03.26 |
[SonarQube 02] "Random" objects should be reued (0) | 2023.03.25 |