해시 해킹

Young·2024년 2월 22일
post-thumbnail

웹사이트에서 새로 회원가입을 하다보면 우리는 자주 아래와 같은 것을 보게 됩니다.

이 안정성은 어떤 기준으로 판단하는 건지 궁금해졌습니다. 생각해보면 7자나 8자나 별로 차이가 없을 것 같고 귀찮게 특수문자랑 대문자는 왜 넣으라는 건지 모르겠습니다.

그래서 한번 따져봤습니다.
일단 우리가 위 비밀번호란에 적어넣는 문자는 문자 그대로 저장되지 않고 해시 함수라는 것을 적용해서 저장된다고 가정하겠습니다. (해커가 중간에 가로챌 수도 있으니까요!)

해시 함수를 저의 비밀번호 문자열을 가지고 인위적인 규칙에 따라 어떤 다른 값으로 바꿔주는 함수라고 하고 해커가 이 함수의 규칙을 알아챘다고 해보겠습니다.

제가 비밀번호로 55가지의 문자중에서 10개를 골라 비밀번호를 만들었고 해커가 저의 해시값으로부터 비밀번호를 유추하기 위해 하나하나 해쉬 함수에 역으로 가능한 값을 대입한다고 했을 때...

2 GHz의 CPU로 연산을 하면 대충 무려 4년 남짓 걸립니다. 그런데 만약 제가 9개를 골랐다면 한달도 안걸립니다. 여기에 만약 제가 소문자 26개만 사용해서 패스워드를 만들었다면 하루도 안걸리게됩니다.


[Java]

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    static public void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(bf.readLine(), " ");
        int passwordLength = Integer.parseInt(st.nextToken());
        int numberOfChars = Integer.parseInt(st.nextToken());
        int base = Integer.parseInt(st.nextToken()); // not used

        int hash = Integer.parseInt(bf.readLine());  // not used
        int divisor = 1000000007;

        double remainder = 1;
        for (int i = 1; i <= passwordLength - 1; ++i) {
            remainder = (numberOfChars * remainder) % divisor;
        }

        System.out.print(Double.valueOf(remainder).intValue());
    }
}

문제 바로가기: http://boj.kr/6ac8e5c7137d4901976a81ee742df7f0

profile
생각을 영하게

0개의 댓글