프로그래밍 공부/JAVA
Java - 암호화 (단방향)
뚜뚜:)
2020. 11. 23. 18:41
암호화
- 단방향 : 데이터를 암호화하고나서 원래 데이터로 바꿀 필요가 없을때 사용하는 암호화 방식
- 양방향 : 데이터를 암호화 했다가 원래 데이터로 복원(복호화)을 해서 시키는 방식
-> 크게 양방향, 단방향으로 구분하고 그다음 대칭키, 비대칭키로 구분한다
대칭키 (비공개 키 방식)
- 암호화 할때 사용했던 키와 복원할 때 사용하는 키값이 같을 때
-> 암호화, 복호화시 모두 동일한 키를 사용하므로 키 값을 비공개 한다.
- 장점 : 처리하는속도가 빠르다 / 단점 : 노출우려(노출되면 굉장히 위험하다)
- des(예전), aes(des를 보완한 ) 방식
비대칭키(공개 키 방식)
- 일반데이터를 암호화 할때 키를 사용, 암호화를 시킬 때 키가 두개 만들어진다.
-> 암호화, 복호화 둘다 다른 키를 사용한다(하나만 비밀키, 다른 하나는 공개키)
- 장점 : 키가 하나였을때 보다 훨씬 안전하다 / 단점 : 느리다
- rsa방식
더보기
MD5 (Message-Digest algorithm 5)
MD5는 메세지 축약 알고리즘으로써, 파일 무결성 검사용도로 많이 쓰이고 있다.
128bit 의 해쉬를 제공하며, 암호와와 복호화를 통하여 보안용도로도 많이 쓰인다.
하지만 암호화 결함이 발견되어 보안 용도로 사용할때에는 SHA와 같은 다른 알고리즘을 사용하는것이 권장
public Strimg md5(Strimg msg) throws NoSuchAlgorithmException{
//암호화를 지원 해주는 메서드
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(msg.getBytes()); //암호화하기
return byteToHexString(md.digest()); //암호화한 데이터를 가져와 16진수로 변환해서 반환 (꺼내오는 명령어 : digest())
// ==> 암호화한 데이터를 16진수로 많이 출력해주므로 변환해주고 변환해준 값을 반환한다.
}
// byte배열의 데이터를 16진수 값으로 변환하는 메서드
public String byteToHexString(byte[] data) {
StringBuilder sb = new StringBuilder();
for(byte b : data) {
// &가 하나만 있으면 비트 and연산자 * 비트 : 0아니면 1밖에 없음 (0은 거짓, 1은 참)
// 0x 는 16진수, ff / ((b & 0xff) + 0x100) ==> 16진수 2자리 만들기
// b가 10이라고 치면 16진수로 치면 10은 a,
// 0xa + 0x100 ==> 0x0a ==> 0xa + 0x100 ==> 0x10a ==> "10a"(문자열로 표시) ==> "0a" (문자열)
// 1010 & 11111111 ==> 00001010 + 100000000 => 100001010 ==> 10a ==> "10a".substring(1) ==> "0a"
sb.append(Integer.toHexString((b & 0xff) + 0x100).substring(1));
// toHexString : 16진수 문자열로 바꿔주는 메서드
}
return sb.toString(); //데이터를 16진수 문자열로 바꿔준다
}
//문자열을 SHA-256방식으로 암호화한다.(자리수 : 64byte)
public String sha256(String msg) throws NoSuchAlgorithmException {
MessageDigest sha256 = MessageDigest.getInstance("SHA-256");
sha256.update(msg.getBytes());
return byteToHexString(sha256.digest());
}
//문자열을 SHA-512방식으로 암호화한다.(자리수 : 128byte)
public String sha512(String msg) throws NoSuchAlgorithmException {
MessageDigest sha512= MessageDigest.getInstance("SHA-512");
sha512.update(msg.getBytes());
return byteToHexString(sha512.digest());
}
- byteToHexString : 바이트 배열을 16진수로 변환하는 메서드
public static void main(String[] args) throws NoSuchAlgorithmException, InvalidKeyException,
NoSuchPaddingException, InvalidAlgorithmParameterException, IllegalBlockSizeException,
BadPaddingException, UnsupportedEncodingException {
//단방향 코드가 저장되어있는 객체 생성하여 불러오기
CryptoUtil crypto = new CryptoUtil();
// String plainText = "Hello, World";
String plainText = "안녕하세요, 반갑습니다.";
System.out.println("단방향 암호화");
System.out.println("mds : " + crypto.md5(plainText));
System.out.println("sha-256 : " + crypto.sha256(plainText));
System.out.println("sha-512 : " + crypto.sha512(plainText));