[Java 풀스택 과정 강의] 3월 17일

부트캠프 일지/Java 풀스택 과정 강의
2026.03.19
※ TIL와는 별개로 적는 개인 개발 일지라서 말은 좀 편하게하는 페이지입니다.
일지이기 때문에 일기의 성격이 더 강합니다.

 

 

SHA256

SHA256 또한 MD5와 같은 해싱 중 하나이다. SHA-2 계열로, 128비트였던 MD5보다 긴 256비트로 현재로서는 권장되는 방법이다. 다만 후술할 SALT 및 키 스트레칭과 함께 사용되는 편이다. 사용 코드는 다음과 같다.

 

    public static String sha256(String msg) throws NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("SHA256");

        md.update(msg.getBytes());
        return bytesToHex(md.digest());
    }

    public static String bytesToHex(byte[] bytes){
        StringBuilder builder = new StringBuilder();
        for(byte b : bytes){
            builder.append(String.format("%02x", b));
        }
        return builder.toString();
    }

 

MD5와 같이 16진수이지만 좀 더 깔끔하게 다듬어서 SHA-256을 사용한다.

보다시피 핵심은 MessageDigest.getInstance()로서, MD5의 경우 MD5를 적었지만, SHA256은 SHA-256으로 적었다. 이후는 MD5와 비슷하지만 StringBuilder 등 사용하여 좀 더 깔끔하게 다듬었다(필드 저장 등을 생략하고, toHex과정을 String.format으로 더 간단하게 하였다).

 

 

SALT

다만 SHA-256와 같이 해시만 사용할 경우 브루트 포스 공격과 같은 무차별 대입을 통하여 해시값을 비교하여 알 수 있고, 최근에는 이 SHA-256에 대한 레인보우 테이블 또한 존재하기 때문에 SALT 및 키 스트레칭을 사용한다. 키 스트레칭의 경우 SHA-256과 같은 해싱을 N번 반복하여 만드는 것이다.

SALT는 SecureRandom이라는 클래스를 사용하여 만드는 난수값으로, 회원 별로 별도의 서버에 저장하여(해시 값이 있는 서버와 다른 서버를 사용해야한다.) 해당 회원이 로그인 할 때 DB에서 값을 불러와 해시와 같이 조합하여 사용하게 된다. 따라서 SHA-256을 사용하더라도 각 회원별로, 그리고 사이트별 마다 SALT와 키스트레칭으로 복잡한 값이 만들어짐으로써 데이터가 누출되더라도 쉬이 로그인하지 못하도록 하는 것이다.

 

    public static String getSALT() throws Exception {
        SecureRandom rnd = new SecureRandom();
        byte[] temp = new byte[SALT_SIZE];
        rnd.nextBytes(temp);

        return Byte_to_String(temp);
    }

    public static String Byte_to_String(byte[] temp){
        StringBuilder sb = new StringBuilder();
        for (byte a : temp){
            sb.append(String.format("%02x", a));
        }

        return sb.toString();
    }
    
	public static String Hashing(byte[] password, String salt) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");

        for (int i = 0; i < 10000; i++) {
            String temp = Byte_to_String(password) + salt;
            md.update(temp.getBytes());
            password = md.digest();
        }

        return Byte_to_String(password);
    }

 

최근 비밀번호용 해싱으로는 PBKDF2 / bcrypt / Argon2와 같은 것이 존재한다. 실무에서는 키 스트레칭을 여러번 돌리는 것보다는 이런 것들을 사용하는 경우가 더 많다고.

 

덧붙임

SALT값을 사용자 정보와 같은 테이블에 저장해두기도 하는데, 서버를 하나 더 돌리는 비용(관리 비용) 등 때문에 그렇다고 한다. 하지만 보안상으로는 둘이 나누는 것이 좋다고.