Languages/java

[JAVA] (암호화01) encode && encrypt

뱅타 2021. 4. 13. 22:10

encrypt와 encode

encode

  • 데이터 전송 시 사용된다.
  • 다양한 데이터를 다양한 형태로
  • 오직 데이터를 전달하려는 목적을 가지고 있다.

encrypt

  • encode와 같이 데이터 전송 시 사용되지만
  • 주 목적은 데이터를 보호하기 위해 사용.

encoding 의 방법 (여러가지가 존재)

  1. Url encoding
  1. Base64-대소문자(52 + 숫자)

1.URLEncoding

우리가 자주 사용하는 utf-8 타입으로.(한글은 영문과 다르게 바이트 계산법이 다르다.그걸 지원하는게 utf-8)

encoding은 언제라도 decoding이 가능하다.

encode의 경우 누군가가 데이터를 인지할수 있게끔 하는것이 목적

2. Base64

jdk 1.8 이상에서만 지원함.

버전이 1.8이다. 이전 버전에서는 다른 라이브러리가 필요하다.

현재 1.8을 쓰고 있지만 하위 버전의 경우 mvnrepository에서 commons codec으로 검색 후 pom.xml에 추가가 가능하다.

여기.

Base64의 64는 반환값이 영문 대소문자 52 + 숫자10(0~9) + (+ /)두개 더 해서 64개의 캐릭터로 이루어진다고해서 64이다.

base64를 인코딩 하려면 byte[]가 필요하다.

encoding은 누구나 디코딩이 가능하다. 데이터를 보호하겠다는 목적이 없다.

encrypt(암호화)

kisa의 암호 알고리즘에 관한 ppt를 보는것도 좋다.

분류를 보면 해시함수가 단방향 암호화방식

대칭키, 공개키가 양방향 암호화 방식이다.

간단히 단방향의 경우

회원가입 시 작성하는 password를 암호화 해서 db에 저장할 때 쓰임.

** 복호화가 불가능하다.

대칭키의 단점

키 분배의 문제.

비대칭키의 단점

시간이 오래 걸린다.

이렇게 각자 장단점이 있기 때문에 섞어서 쓰인다.

SHA-512 사용하기

  • 코드
    //		단방향 암호화
    		MessageDigest md = MessageDigest.getInstance("SHA-512");
    		byte[] input = plain.getBytes();
    		byte[] encrypted = md.digest();
    		System.out.println(encrypted.length*8);
    		String encoded = Base64.encodeBase64String(encrypted);
    		System.out.println(encoded);
    //				String savedPass = "z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==";
    //				System.out.println(savedPass.equals(encoded)?"인증성공":"인증실패");
    		return encoded;

암복호화를 하는 도중 데이터는 모두 바이트형식으로.

단방향 - 복호화가 안된다.

비밀번호를 받으면 암호화를 다시 시켜서 맞는지 검사

해시 - 일정한 길이의 문자값을 리턴한다.

디크립트 하려면

초기화 벡터가 필요하기 때문ㅇ에

jdk에서 현재 지원하지 않는 알고리즘을 사용하게 되면 나오는 에러.

초기화 벡터 만들기

만들어서 적용하기

양방향의 비대칭키 암호화

RSA

  • 코드
    String plain = "힘들다...";
    		
    		Cipher cipher = Cipher.getInstance("RSA");
    		
    		KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
    		keyPairGen.initialize(2048);
    		KeyPair keyPair = keyPairGen.generateKeyPair();
    		PrivateKey privateKey = keyPair.getPrivate();
    		PublicKey publicKey = keyPair.getPublic();
    		
    		cipher.init(Cipher.ENCRYPT_MODE, privateKey);
    		byte[] input = plain.getBytes();
    		byte[] encrypted = cipher.doFinal(input);
    		String encoded = Base64.encodeBase64String(encrypted);
    		System.out.println(encoded);
    		
    		//decode
    		byte[] decoded = Base64.decodeBase64(encoded);
    		cipher.init(Cipher.DECRYPT_MODE, publicKey);
    		
    		byte[] decrypted = cipher.doFinal(decoded);
    		System.out.println(new String(decrypted));

728x90
반응형

'Languages > java' 카테고리의 다른 글

[JAVA] fileUpload03  (0) 2021.04.15
[JAVA] (암호화02) 기초적인 원리  (0) 2021.04.13
[JAVA](eclipse)junit 사용하기(단위테스트)  (0) 2021.04.13
[JAVA] 파일업로드02_해보기  (0) 2021.04.12
[JAVA] 파일업로드01_해보기  (0) 2021.04.12