[보안]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값을 이용하여 암호화한 것과 일치여부를 판단한다.
반응형
    
    
    
  블로그의 정보
코딩무비
코딩무비