SHA 256 Salt 없는 카드로 토큰을 만드는 것이 얼마나 위험한지 시험해 보세요.
개시하다
후배들은 실제 데이터에서 토큰키를 생성해 "SHA256 같은 해시로 해도 되나요?"'최소한 살트는 필수'라는 질문에 "살트는 (짧을 수도) 일종의 비밀번호 같은 인상을 주지만, 원데이터가 길면 필요 없을 것 같다"고 답해 화제가 됐다.
충분한 시간이 걸리면 해결할 수 있다. 물론 안 된다. 그러나 이렇게 말하면 충분한 시간은 얼마일까? 생각해 봤다.
식별코드로 오랫동안 사용될 수 있는 번호라면 신용카드 번호가 16자리라 느낌이 좋아서 해봤어요.
신용카드 번호가 어떻게 됩니까?
16자리는 0-9의 값이지만 숫자이기 때문에 처음에 0을 놓을 수 없기 때문에 아래의 공식이다.
10^15×9
=> 9,000,000,000,000,000
그 수가 9000조 종에 이르다니!도대체 이게 계산이 돼요?참고로 실제로 신용카드 번호는 다음과 같은 범위가 있는데 이 분야의 업무 지식을 사용하면 모델을 줄일 수 있을지도 모른다.
샘플 코드
아무튼 Java 놀랄만한 천진난만한 실크로 써봤습니다.병렬화되지 않은 단식홍
String.format
은 무겁다.응, 실제로 나쁜 짓을 하려면 대규모 분산 환경과 비트코인 같은 전용 칩을 사용하기 때문에 최저치를 알 것 같아.var digest = MessageDigest.getInstance("SHA-256");
var max = ((long) Math.pow(10, 15)) * 9;
var start = System.currentTimeMillis();
for (long i = 0; i < max; i++) {
var origin = String.format("%016d", i);
byte[] encodedhash = digest.digest(origin.getBytes(StandardCharsets.UTF_8));
if (i % 100_000_000 == 0) {
var end = System.currentTimeMillis();
var duration = (end - start) / 1000 / 60;
System.out.println(String.format("%016d, %3d min", i, duration) + ": " + Base64.getEncoder().encodeToString(encodedhash));
}
}
실행 결과
시행해 보았다.CPU는 AMD Ryzen 536003.5GHz입니다.그만큼 시간이 필요하기 때문에 1시간이 얼마나 생성되는지 보자.
0000000000000000, 0 min: /NtLQj9OUoOvoknXYu9q7xUOkfzNgQ1D5ecZ0UUS3sc=
0000000100000000, 1 min: I1lt2923PiGMgUueQF3/ve6rib1Bs6gfD73N+3yZ3cw=
0000000200000000, 2 min: wLPVuBN7D+GGfSvvleZeXNbNomPHCdum22IPYKcc02o=
...
0000004300000000, 57 min: a4MlKwfk0636KgNMQI0tScCknkihB3uDjiCWWF9MJDw=
0000004400000000, 58 min: XOqWHXg/vfZDZV1O04GaPbs7KXKS6xZLwn1QUVtTeU0=
0000004500000000, 59 min: lZIncJWW0Ss9SUKmh9BoSz7D+Y0A3Yr03Ei4PXpfJ/Y=
0000004600000000, 61 min: qiF6nBqg3Sp/OXpd+4zxfjxX8usuc8H7hk9bOMq8VlU=
간혹 흔들릴 때도 있지만 약 1분이면 1억건이 생성된다.의외로 할 줄 알았는데.하지만 상대는 9000조다.끝날 때까지 얼마나 걸릴지 계산해 봐.9000000000000000 / 60 / 24 / 365 / 100000000
=> 171
171년이라니!이것은 중간 시간이다.불가능한 건 아니지만 내가 죽으면 좋잖아?당연히 심리적 작용이지.100년 안 돼요?
100년은 안되나?다만, 대전제로서 100년은 필요 없다.
이번에는 다선정도 해본 적이 없는 초간단한 코드지만 이 논리는 원칙적으로 핵심 수분을 축소한다.내 이 CPU에도 6개의 핵심이 있어서 30년도 안 돼서 끝났어.
말하자면 GCP로 80 핵심 기기를 빌리면 2년이면 끝날 수 있고 600만 엔이면 신용카드 번호의 모든 해시표를 계산할 수 있다.
또한, 보고 난잡함을 느낀 나의 코드는 조정할 여지가 많고 Hadoop도 대규모로 분산할 수 있다.또는 전용 칩을 사용하면 계산이 더 빨리 끝난다.이미 누군가가 풀어놓은 것이 이 세상에 존재한다는 얘기다.따라서 실제 판정은 한순간이면 되기 때문에 소금 없이 신용카드를 사용하는 등 잘 알려진 조합이 적은 값은 안전하지 않다고 할 수 있다.
총결산
뭐, 왜 토큰화가 필요한지에 따라 변화가 생겨요. 원래 데이터가 민감한 게 아니라면 전혀 신경 쓸 필요가 없었는데 얼마나 위험한지 알아요.
이번 잡지 조사에 따르면 Google 같은 사이트에서는 찾을 수 없지만, 이 정도 시간 안에 계산할 수 있다면 사전은 확실히 존재한다.산열 함수를 영패로 사용할 때 암호를 중심으로 하는 염호는 매우 중요하다.
소금이나 HMAC을 사용해서 비밀 정보와 조합하는 것이 중요하다.당연히 그 비밀 정보를 관리해야 한다.
그럼 해피해킹!
Reference
이 문제에 관하여(SHA 256 Salt 없는 카드로 토큰을 만드는 것이 얼마나 위험한지 시험해 보세요.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://zenn.dev/koduki/articles/c6ef840d06aaf0텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)