본문 바로가기

JAVA

Java SHA-256 SALT 를 사용하여 비밀번호 암호화

요즘은 암호화된 데이터를 복호화 할 수 있는 양방향 암호화 방식이 아닌 일방향 암호화

즉, 암호화된 데이터를 복호화  할 수 없는 암호화 방식을 사용하는 SHA-256, SHA-512 방식의 암호화를 주로 사용합니다.

일방향 암호화는 비밀번호가 유출되어도 원래 암호를 알아내기가 힘듭니다.

 

예를 들어 SHA-256를 사용하여 비밀번호 pwd1을 저장하면

3b86ff88ef6c490628285f482af15ddcb29541f94b

와 같은 해시값을 생성하여 이를 패스워드 값으로 DB에 저장하게 됩니다.

그럼 로그인할 때 비밀번호를 다시 SHA-256을 사용하여 DB에 저장된 값과 비교하여 맞는지 확인 하는 절차를 거치면 비밀번호를 직접 DB에 저장해서 비교하는 것 보다는 안전하게 됩니다.

 

하지만 이것만으로도 충분히 안전하기 않기 때문에 

일방향 암호화를 구현하기 위해서 SHA-256 해쉬 알고리즘을 사용하여 SALT라는 난수와 함께 암호화를 하고 DB에 암호화된 비밀번호와 SALT 값을 같이 입력합니다.

 

로그인 할 때는 ID로 SALT 값을 조회하여 입력한 비밀번호와 SALT 값을 다시 암호화 하여 비밀번호가 맞는지 확인 합니다.

 

1. 테이블에 랜덤으로 방생된 난수 SALT값을 생성하여 비밀번호를 암호화 하고 암호화된 비밀번호와 SALT값을 컬럼을 추가한다.

2. 로그인 할 때 SALT값을 가져와 입력한 비밀번호로 암호화 하여 비밀번호가 맞는지 확인한다.

 

public class Utils {
	
  public static String getSalt() {
     Random random = new Random();     
     byte[] salt = new byte[10];

     random.nextBytes(salt);     

     StringBuffer sb = new StringBuffer();

     for(int i=0; i<salt.length; i++) {
     	sb.append(String.format("%02x", salt[i]));
     }     

     return sb.toString();
  }

  public static String getEncrypt(String pwd, String salt) {
	
      byte[] salt = salt.getBytes();
      String result = "";

      byte[] temp = pwd.getBytes();
      byte[] bytes = new byte[temp.length + salt.length];

      try {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        md.update(bytes);

        byte[] b = md.digest();
  
        StringBuffer sb = new StringBuffer();

        for(int i=0; i<b.length; i++) {
        	sb.append(Integer.toString((b[i] & 0xFF) + 256, 16).substring(1));
        }

        result = sb.toString();

     } catch (Exception e) {
        logger.error(e);
     }

     return result;
  }
}


Utils.getEncrypt(password, id);