Skip to content

fix: EgovSequenceGenerator 가 예측 가능한 Math.random() 을 쓰고 솔트마다 SecureRandom 을 새로 만들던 문제 수정 - #412

Open
comghost wants to merge 1 commit into
eGovFramework:mainfrom
comghost:fix/reactive-sequence-generator-secure-random
Open

fix: EgovSequenceGenerator 가 예측 가능한 Math.random() 을 쓰고 솔트마다 SecureRandom 을 새로 만들던 문제 수정#412
comghost wants to merge 1 commit into
eGovFramework:mainfrom
comghost:fix/reactive-sequence-generator-secure-random

Conversation

@comghost

Copy link
Copy Markdown

수정 사유 Reason for modification

  • 버그수정 Bug fixes
  • 기능개선 Enhancements
  • 기능추가 Adding features
  • 기타 Others

수정된 소스 내용 Modified source

문제

EgovSequenceGenerator 는 시각(17자)에 랜덤 5자를 붙인 문자열을 16바이트 솔트와 함께 해시해 시퀀스를 만듭니다.
그런데 두 난수가 서로 다른 소스에서 나옵니다.

  • 랜덤 5자는 Math.random() — 시드가 관측되면 다음 값을 예측할 수 있는 일반 난수입니다.
  • 솔트는 호출마다 new SecureRandom() — 안전하지만 매번 인스턴스를 만들어 시드 수집 비용을 반복합니다.

수정

클래스 단위로 공유하는 SecureRandom 하나로 랜덤 문자열과 솔트를 모두 만듭니다. SecureRandom 은 스레드 안전하므로
WebFlux 의 동시 호출에서도 공유할 수 있습니다.

private static final SecureRandom RANDOM = new SecureRandom();
...
sb.append(characters.charAt(RANDOM.nextInt(characters.length())));   // Math.random() 대신
...
RANDOM.nextBytes(salt);                                              // new SecureRandom() 대신
  • 생성 형식(시각 17자 + 5자, 다이제스트 16진수)과 공개 메소드 시그니처는 그대로입니다.
  • 솔트가 이미 SecureRandom 이었으므로 결과 해시의 예측 불가성이 새로 생기는 것은 아닙니다. 이 PR 은 난수 소스를
    하나로 통일
    하고 호출마다 SecureRandom 을 만들던 비용을 없애는 정리입니다.

JUnit 테스트 JUnit tests

  • JUnit 테스트 JUnit tests
  • 수동 테스트 Manual testing

EgovSequenceGeneratorTest 2건 추가(기존 mockStatic 테스트 1건 유지), fdl.reactive 모듈 전건 통과.

환경 기본 로케일(Locale) 모듈 실행 건수 결과
Windows ko_KR 5 Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
Linux (Ubuntu 22.04 / OpenJDK 17) C.UTF-8 5 Tests run: 5, Failures: 0, Errors: 0, Skipped: 0
구분 건수 내용
실동작 1 모킹 없이 SHA-256 시퀀스 1,000건 — 64자 소문자 16진수이고 전부 서로 다르다(같은 밀리초 포함)
형식 1 랜덤 문자열은 숫자 17자 뒤에 허용 문자 집합(A-Za-z0-9) 5자

수동 확인: 현재 main(cc2b332) 위에서 fdl.reactive 모듈 빌드·테스트가 통과함을 Windows 와 Linux 에서 확인했습니다.

테스트 브라우저 Test Browser

  • Chrome
  • Firefox
  • Edge
  • Safari
  • Opera
  • Internet Explorer
  • 기타 Others

해당 없음 — 라이브러리 내부 수정입니다.

테스트 스크린샷 또는 캡처 영상 Test screenshots or captured video

해당 없음 — 위 JUnit 테스트 결과로 갈음합니다.


base: eGovFramework:main @ cc2b332 (2026-09-10 fetch 기준, #366~#379 머지 후) · 단일 커밋

…dom 을 새로 만들던 문제 수정

WebFlux 시퀀스 생성기는 시각 + 랜덤 5자 문자열을 솔트와 함께 해시한다. 랜덤
문자열은 Math.random() 으로, 솔트는 호출마다 new SecureRandom() 으로 만들었다.
Math.random() 은 시드가 관측되면 예측 가능한 난수이고, SecureRandom 을 호출마다
새로 만드는 것은 시드 수집 비용만 반복한다.

- 클래스 단위로 공유하는 SecureRandom 하나로 랜덤 문자열과 솔트를 모두 만든다.
  SecureRandom 은 스레드 안전하다
- 생성 형식(시각 17자 + 5자, SHA 다이제스트 16진수)과 공개 메소드는 그대로다

EgovSequenceGeneratorTest 2건 추가 — 모킹 없는 실동작으로 시퀀스 1,000건의 형식과
유일성, 랜덤 문자열의 길이와 허용 문자 집합을 확인한다.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant