본문 바로가기

수업 & 공부/용어 정리

32- Hash에 대해 알아보자

 

Hash는 Key와 Value가 쌍을 이루는 자료구조이다

  >> 필요한 데이터를 키 값을 통해, 아주 빠르게 탐색가능하다

 

  Hash는 Key값을 Hash Function을 통해, HashCode를 뱉어서

  저장공간의 Size로 나눠 Index를 정하여 Value값을 저장한다

 

  Hash Function? 데이터의 효율적 관리를 위해 임의의 길이를 가진 데이터를

  고정된 길이를 가진 데이터를 매핑해주는 함수이고, input(Key)과 output(HashCode)을 가진다.

 

 

해시 충돌이란?

  위 과정에서 다른 Key값에 대해서  Hash Function이 같은 HashCode를 내밷어서

  같은 Index에 연결되어 저장되기도하고,

 

  다른 Key값에 대해서  Hash Function이 다른 HashCode를 내밷어도,

  Index를 구하는 과정에서 똑같은 공간을 가리켜 연결 저장되는 경우도있다.

  

  이처럼 다른 Key값에 대해서 Index가 충돌하는 경우를 Hash Collison (해시충돌)이라고 말한다.

 

  출처 ( https://bangu4.tistory.com/179 )

 

 

 

public class Main {

    public static void main(String[] args) {
        System.out.println("Java HashCryptoPractice");

        String password = "dddd";
        String salt = String.valueOf(UUID.randomUUID());    // 무작위 문자열 : 회원가입 할 때 생성되어 DB의 salt 컬럼에 insert된다
        String saltPassword = salt + password;
        String encodedPassword = "";
        

        try{
            MessageDigest digest = MessageDigest.getInstance("SHA-1");
            digest.reset();;
            digest.update(saltPassword.getBytes(StandardCharsets.UTF_8));
            encodedPassword = String.format("%040x",new BigInteger(1,digest.digest()));
        }catch (NoSuchAlgorithmException e){
            e.printStackTrace();
        }

        System.out.println("password = " + password);
        System.out.println("salt = " + salt);
        System.out.println("salt+Password = " + saltPassword);
        System.out.println("encodedPassword = " + encodedPassword);
    }
}

 

어떻게 사용할까?

 

로그인에서 사용하는 password와 무작위 문자열을 생성하는 salt를 섞어서 Hash함수에 넣어줄 것이다

 

Java에서 SHA-1형식으로 Hash하려면  MessageDigest 클래스를 이용한다.

 - SHA-1, MD5, SHA-255 여러가지 패밀리? 가 있다

 - SHA-1 버전의 경우, 해독의 가능성과 해시 충돌이 발생하였기 때문에 사용을 권장하지는 않는다.

 

 

해시 충돌이란?

 

 

아래는 각 결과값을 출력했다

 

'수업 & 공부 > 용어 정리' 카테고리의 다른 글

46 : 제네릭 (Generics)  (0) 2021.10.11
39 : Springboot (Rest API - @PathVariable )  (0) 2021.09.30
29- 컴파일 언어& 인터프리터 언어  (0) 2021.09.06
13- 세션과 쿠키  (0) 2021.08.18
12- forward 와 redirect  (0) 2021.08.17