안전하게 토큰 비교하기 - String.equals() vs MessageDigest.isEqual()
·
JAVA
들어가며..Refresh Token 재발급 로직을 구현해 PR을 올렸는데, CodeRabbit으로부터 다음과 같은 피드백을 받았다.처음에는 단순히 문자열 비교를 통해 저장된 토큰과 일치하는지를 판별했지만, 해당 피드백을 보고 나서 타이밍 공격이 무엇인지, 그리고 MessageDigest.isEqual이 어떻게 이를 방지하는지에 대해 알게 되었고 더 깊이 알아보고자 한다.타이밍 공격(Timing Attack)이란?타이밍 공격(Timing Attack)은 암호 알고리즘이 실행되는 데 걸리는 시간을 분석하여 암호 시스템을 공격하는 부채널 공격(side-channel attack)의 일종이다. 컴퓨터의 모든 논리 연산은 수행하는 데 시간이 소요되며, 이 시간은 입력값에 따라 달라질 수 있다. 따라서 각 연산의 ..
안전하고 Thread-safe하게 난수 생성하기
·
JAVA
EduKit 서비스에는 이메일 인증 프로세스가 존재한다. 인증 코드 생성의 보안성을 높이기 위해 고민하던 중, 여러 가지 방법들에 대해서 알게 되었고 특히, Math.Random 메서드 그리고 Random과 SecureRandom 클래스의 차이에 대해 알게 되었다. 먼저 난수가 무엇인지부터 차근차근 살펴보자.난수난수란, 예측 불가능성을 만족하기 위해 무작위하게 생성되는 값을 말한다.난수의 성질무작위성 (Randomness)통계적인 성질을 조사했을 때, 치움침이 없을 경우 무작위하다고 판단한다. 이때, 주의해야할 것이 '무작위하다'와 '예측할 수 없다'는 동일하지 않다는 것이다. 무작위하기 때문에 예측할 수 없다는 것은 불충분 조건이다. 때문에 무작위성만 가지는 난수를 약한 의사난수(Pseudo Rando..