Spring-JSP

[Spring-JSP] SHA-256 / SHA-512 암호화

Jeong Jeon
반응형

기본적으로 SHA는 단방향 암호화 알고리즘이다.

보통 비밀번호와 같이 중요정보를 hash화 하여 암호화를 진행한다. 비밀번호는 복호화하여 비교할 필요가 없기때문에...

그래서 DataBase에 암호화된 비밀번호와 사용자가 입력한 비밀번호를 SHA로 암호화 하여 비교하며 사용할 수 있다.

사용법은 매우 간단하다.

SHA암호화의 단점이라고는...음... Rainbow Table(해시 함수를 사용하여 변환 가능한 모든 해시 값을 저장시켜 놓은 표)를 사용하여 SHA 알고리즘의 해독이 가능할 수 있다는 점...

다만 엄청난 시간이 필요하다고 한다.

 

그렇지만 조금더 안전을 기하기위하여 본인은 RSA 암호화 후 SHA암호화를 통해 비밀번호 암호화를 진행하였다.

SHA암호화는 기본적으로 256 / 512 두가지를 제공하며, Hash값을 나타낸다.

당연히 Hash값이 클수록 더욱 복잡한 암호화가 적용된다는것....!

 

1). SHA512SecureUtil.java

  • 암호화 모듈을 만들어서 사용하자~
  • 단방향 암호화기 때문에 별도의 복호화 메소드는 제공하지 않는다.
  • 암호화 하고 싶은 hash값별로 메소드를 불러 사용하면 된다.
public class SHA512SecureUtil {

/**

* 전달받은 문자열을 salt 사용 하여 sha512 로 암호화하여 리턴한다.

* @param str

* @param salt

* @return

* @throws Exception

*/

public static String incryptSha512(String str, String salt) throws Exception {

	String encStr = null;

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

	md.update(salt.getBytes("UTF-8"));

	byte[] bytes = md.digest(str.getBytes("UTF-8"));

	StringBuilder sb = new StringBuilder();

	for(int i=0; i< bytes.length ;i++){

		sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));

	}

	encStr = sb.toString();

	return encStr;

}

/**

* 전달받은 문자열을 salt 사용 하여 sha256 로 암호화하여 리턴한다.

* @param str

* @param salt

* @return

* @throws Exception

*/

public static String incryptSha256(String str, String salt) throws Exception {

	String encStr = null;

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

	md.update(salt.getBytes("UTF-8"));

	byte[] bytes = md.digest(str.getBytes("UTF-8"));

	StringBuilder sb = new StringBuilder();

	for(int i=0; i< bytes.length ;i++){

		sb.append(Integer.toString((bytes[i] & 0xff) + 0x100, 16).substring(1));

	}

	encStr = sb.toString();

	return encStr;

}

public static String generateAuthToken() throws Exception {

	SecureRandom secureRandom = new SecureRandom();

	Base64.Encoder base64Encoder = Base64.getUrlEncoder();

	byte[] randomBytes = new byte[24];

	secureRandom.nextBytes(randomBytes);

	return base64Encoder.encodeToString(randomBytes) + System.currentTimeMillis();

}

public static void main(String[] args) throws Exception {

	String token = SHA512SecureUtil.generateAuthToken();
	
	System.out.println(token);

}

}
반응형