초급의 끄적거림

[Base64] base64 암호화 복호화 본문

JAVA

[Base64] base64 암호화 복호화

codingD 2019. 11. 28. 11:26

0. Base64란?


  • 8비트 이진 데이터를 문자 코드에 영향을 받지 않는 공통 ASCII영역의 문자들로만 이루어진 일련의 문자열로 바꾸는 인코딩 방식

1. Base64 동작방식


  • base64는 8bit의 데이터를 6bit의 크기로 표현 - 24bit를 단위로 하여 3개의 문자에서 4개의 문자를 얻게 됨

abc 라는 3개의 문자열에서 YWJj를 얻음

  • 6bit의 2진수는 아래의 base64 table을 이용하여 문자로 바꿔줌

  • 만약 인코딩할 문자가 3개 (24bit) 단위가 아닐 때

 : 위의 결과를 보면 a 라는 문자 하나를 넣었을 때 'YQ=='로 base64 table에는 없는 '=' 문자가 추가됨

 : '='은 bit 수를 맞춰주기 위해서 0으로 채워주는 패딩이라는 것

2. 공통으로 쓰기 위해서 만듦.


  • 비밀번호와 쿠폰 번호의 암호화를 위함
  • 비밀번호를 암호화하여 insert 했다가 그것을 다시 되돌리려는 (복호화) 작업

3. 염두할 것


(직접 다 써놓고 생각할 것 - 주석으로 남길 경우, 최종까지 주석을 삭제하지 말 것)

  • 인코딩, 디코딩 하려는 값의 여부 확인하기 (만약 값이 없을 수도 있는데 실행이 될 수 있기 때문에 사전차단)
  • getByte를 인코딩
  • 리턴 값이 필요한가? 어떤 타입으로 리턴을 해야하는가? (리턴의 경우, 로직 실행 후 나온 값을 실행한 사람에게 되돌려줘서 보여줘야하는지 아닌지를 생각해 볼 것)
  • 어떤 결과를 원하는가
  • 공통 마다 다르긴하지만 무작정 throw를 써서 던져버리면 쓰던 사람이 오류가 나면 그게 왜 던져졌는지 알지 못하는 경우가 있기 때문에 throw 말고 try~catch 사용함
//인코딩 (암호화)
public String getEncoder(String data) {
			byte[] encoded = null;
			Encoder encoder =null;
			try {				
				//data == null 이라고 쓰는 것보다 isblank로 빈 칸 처리
				if(StringUtils.isBlank(data)) {
                	//TODO  CreteriaInf올라오면 나중에 리턴값 수정해줘야함 (일단은 ""로 리턴)
					return "";					
					//return CreteriaInfo.FAIL;
				}
				//바이트 변환 
				encoded = data.getBytes();
				//인코딩
				encoder = Base64.getEncoder();
				//encoder.encode(encoded);
			}catch(Exception e){
				logger.debug("인코딩 오류가 발생하였습니다",e.getMessage());
				e.getStackTrace();
			}
			//인코딩한 문자열 return
			return new String(encoder.encode(encoded));
		}	
//디코딩 구현
		//E 리턴 필요한가? 어떠한 타입으로 리턴해야하는가
		public String getDecode(String data) {
			byte[] decoded = null; 
			Decoder decoder = null;
			try {
				if(StringUtils.isBlank(data)) {
					return "";
					//TODO  CreteriaInf올라오면 나중에 리턴값 수정해줘야함
					//return CreteriaInfo.FAIL;
				}
				decoded = data.getBytes();			
				decoder = Base64.getDecoder();
				
			//decoder.decode(decoded);
			
			}catch(Exception e) {
				logger.debug("디코딩 오류가 발생하였습니다",e.getMessage());
				e.getStackTrace();
			}
			//디코딩한 문자열 return
			return new String(decoder.decode(decoded));
		}
Comments