프로그래밍 공부/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));