String.hashCode()로 전화 번호를 해쉬하면,


역으로 해쉬 값으로부터 전화 번호를 찾아낼 수 있을까?


간단히 다음가 같은 테스트를 해볼 수 있다.


public class StringTest {


    @Test

    public void test() {

        Set<Integer> hashCodeSet = new HashSet<Integer>(9999999);

        for (long l = 0; l <= 9999999; l++) {

            String phone = "010" + String.format("%08d", l);

            hashCodeSet.add(phone.hashCode());

//            System.out.println(phone);

//            System.out.println(hashCodeSet.size() + "/" + (l + 1));

        }

        System.out.println(hashCodeSet.size());

    }


}


하나의 충돌도 발생하지 않았다.


해쉬 함수 (Function)가 놀랍도록 잘 동작하고 있음을 확인할 수 있다.


당연히 이런 식으로 역으로 찾아낼 수 있겠다.


이것은 자바 (Java)의 String.hashCode()의 문제가 아니다.


어떤 해쉬 알고리즘을 사용하든지 알고리즘이 노출되면 역으로 찾아낼 수 있다.


암호 키 (Key)를 사용하고 이를 노출시키지 않으면 되겠지만,


자바스크립트 (JavaScript)처럼 완전히 노출되는 경우에는 어떻게 해야 할까?

Posted by izeye

댓글을 달아 주세요