SHA 256 Salt 없는 카드로 토큰을 만드는 것이 얼마나 위험한지 시험해 보세요.

8120 단어 Securitytech

개시하다


후배들은 실제 데이터에서 토큰키를 생성해 "SHA256 같은 해시로 해도 되나요?"'최소한 살트는 필수'라는 질문에 "살트는 (짧을 수도) 일종의 비밀번호 같은 인상을 주지만, 원데이터가 길면 필요 없을 것 같다"고 답해 화제가 됐다.
충분한 시간이 걸리면 해결할 수 있다. 물론 안 된다. 그러나 이렇게 말하면 충분한 시간은 얼마일까? 생각해 봤다.
식별코드로 오랫동안 사용될 수 있는 번호라면 신용카드 번호가 16자리라 느낌이 좋아서 해봤어요.

신용카드 번호가 어떻게 됩니까?


16자리는 0-9의 값이지만 숫자이기 때문에 처음에 0을 놓을 수 없기 때문에 아래의 공식이다.
10^15×9
=> 9,000,000,000,000,000
그 수가 9000조 종에 이르다니!도대체 이게 계산이 돼요?
참고로 실제로 신용카드 번호는 다음과 같은 범위가 있는데 이 분야의 업무 지식을 사용하면 모델을 줄일 수 있을지도 모른다.
https://gist.github.com/matsubo/2c91c9cbedf17a490dca
https://ja.wikipedia.org/wiki/Luhn계산법

샘플 코드


아무튼 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을 사용해서 비밀 정보와 조합하는 것이 중요하다.당연히 그 비밀 정보를 관리해야 한다.
그럼 해피해킹!

좋은 웹페이지 즐겨찾기