← 질문 목록
#362깊이 0
무작위 값은 어디서 만들어야 안전한가?
운영체제가 모아 둔 예측하기 어려운 원천에서 만든다. 시각이나 순번을 씨앗으로 쓰면 그 수열이 재현된다.
- 시각만으로 씨앗을 정한다
그다음은 만든 때를 아는 공격자에게 씨앗 후보가 몇 초 폭으로 좁아진다입니다. 그다음
만든 때를 아는 공격자에게 씨앗 후보가 몇 초 폭으로 좁아진다그다음은 그 범위를 전부 돌려 본다입니다. 그다음
그 범위를 전부 돌려 본다그다음은 같은 수열을 재현해 토큰을 맞힌다입니다. 그다음
같은 수열을 재현해 토큰을 맞힌다
씨앗에 예측하기 어려운 값이 섞이면 이 재현이 안 된다. 위험한 것은 씨앗이 시각이나 순번뿐이고 만드는 방법도 뻔할 때다.
주의
흔히 쓰는 난수 함수는 빠르고 고르게 퍼지도록 만들어졌지, 맞히기 어렵게 만들어지지 않았다. 몇 개만 보면 다음 값을 계산할 수 있는 것도 있다.
그래서 언어마다 보안용 난수가 따로 있다. 세션 토큰과 비밀번호 재설정 링크처럼 맞히면 안 되는 값은 이쪽으로 만든다.
길이도 함께 본다. 원천이 좋아도 짧으면 전부 시도해 볼 수 있다. 맞히면 안 되는 토큰은 충분히 길게 잡는다.
순번이나 사용자 번호를 그대로 쓰면 다음 값을 그냥 셀 수 있다. 주소에 순번이 드러나면 남의 자원을 순서대로 훑을 수 있다.
보안 값에는 예측하기 어려운 난수가 필요하다. 화면 배경을 고를 난수와 세션 토큰을 만들 난수는 요구가 다르다.