[JAVA] SHA-256 암호화 예제

Yuni·2023년 8월 3일
0

Java

목록 보기
9/14

SHA-256

  • Secure Hash Algorithm의 한 종류로서 256비트로 구성되어있고 64자리의 문자열을 반환
  • 이러한 방식은 암호화된 문자열을 다시 원래의 문자열로 복호화할 수 없는 단방향 암호화 방식
  • 입력값이 조금만 달리지더라도 변환되는 값이 완전히 달라지기 때문에 변환 값을 토대로 입력값을 유추하는 것은 거의 불가능

사용방식

로그인에 적용한다고 했을 때 랜덤으로 발생한 암호화한 값을 DB 칼럼에 추가

  • salt 값
  • 비밀번호 + salt

회원가입시에만 랜덤으로 salt를 부여 후 DB에 저장 해주고
로그인할때 salt 값을 가져와서 평문화된 비밀번호랑 합쳐서
비밀번호 + Salt값을 비교해서 로그인 하면 된다고 한다!

평문 암호화 코드

public String encrypt(String pwd) throws NoSuchAlgorithmException {
	String raw = pwd;
    String hex = "";

	MessageDigest md = MessageDigest.getInstance("SHA-256");

	md.update(raw.getBytes(Charset.forName("UTF-8")));
    hex = String.format("%064x", new BigInteger(1, md.digest()));
        
    return hex;
}

Salt 랜덤 생성

public String salt() throws Exception{
	SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
    byte[] bytes = new byte[16];
    random.nextBytes(bytes);
        
    String salt = new String(Base64.getEncoder().encode(bytes));
    return salt;
}

평문 + Salt 암호화 코드

public String encrypt(String pwd) throws NoSuchAlgorithmException {
	String raw = pwd;
    String hex = "";
    
    /* 회원가입시 salt 값을 가져오고 DB에 저장해준뒤
       그 후에는 DB에서 Salt값 가져와서 암호화 후 비교하기*/
    String rawAndSalt = raw+salt();
    
    MessageDigest md = MessageDigest.getInstance("SHA-256");
        
    md.update(rawAndSalt.getBytes());
    hex = String.format("%064x", new BigInteger(1, md.digest()));
    
    return hex;
}

참고문서
https://cocoon1787.tistory.com/832
https://altongmon.tistory.com/673

profile
backend developers

1개의 댓글

comment-user-thumbnail
2023년 8월 3일

좋은 정보 감사합니다

답글 달기