코딩무비

[보안]SHA256 암호화 적용하기

by 코딩무비
반응형

SHA256이란?

SHA(Secure Hash Algorithm)의 한 종류로 256비트로 구성되어 있는 64자리의 문자열을 반환한다. 일반적으로 비밀번호 암호화시 SHA256 알고리즘을 사용한다.

 

  • 평문을 암호화했을 때 다시 평문으로 복호화할 수 없는 암호화인 단방향 암호화 알고리즘을 기반으로 한다.
  • 키의 경우 난수인 uuid을 이용한다.(중복이 거의 발생하지 않는다.)
  • SHA256의 경우 임의의 입력 값을 받아 256bit(32byte)로 64자리 문자열을 반환한다.

암호화 클래스

public class OpenCrypt {

	public static byte[] getSHA256(String source, String salt) {
		byte byteData[] = null;
		try {
			MessageDigest md = MessageDigest.getInstance("SHA-256");
			md.update(source.getBytes());
			md.update(salt.getBytes());
			byteData = md.digest();
			System.out.println("원문: " + source + "   SHA-256: " + byteData.length + "," + byteArrayToHex(byteData));
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return byteData;
	}

	public static byte[] generateKey(String algorithm, int keySize) throws NoSuchAlgorithmException {

		KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
		keyGenerator.init(keySize);
		SecretKey key = keyGenerator.generateKey();
		return key.getEncoded();
	}

	public static byte[] hexToByteArray(String hex) {
		if (hex == null || hex.length() == 0) {
			return null;
		}

		byte[] ba = new byte[hex.length() / 2];
		for (int i = 0; i < ba.length; i++) {
			ba[i] = (byte) Integer.parseInt(hex.substring(2 * i, 2 * i + 2), 16);
		}
		return ba;
	}

	// byte[] to hex
	public static String byteArrayToHex(byte[] ba) {
		if (ba == null || ba.length == 0) {
			return null;
		}

		StringBuffer sb = new StringBuffer(ba.length * 2);
		String hexNumber;
		for (int x = 0; x < ba.length; x++) {
			hexNumber = "0" + Integer.toHexString(0xff & ba[x]);

			sb.append(hexNumber.substring(hexNumber.length() - 2));
		}
		return sb.toString();
	}

}

 

유저별 salt값을 다르게 설정하여 해커가 레인보우 테이블을 이용하여 접근할 수 없게 할 수 있다.

UUID.randomUUID().toString()

그리고 그 salt 값을 db 테이블에 저장하고, 로그인시 db의 salt값을 이용하여 암호화한 것과  일치여부를 판단한다.

반응형

블로그의 정보

코딩무비

코딩무비

활동하기