본문 바로가기
CLASS/SERVLET

#9-1 / 보안

by hingu 2024. 7. 5.

https://dev-eunse.tistory.com/112  : 이건 문자만 단순 암호화.. base64는 쉽게 뚫림

 

✅ security 모든 형태 구조 
암호화 : bit 단위로 문자를 별도의 임의값으로 변경하는 것

 

MD5

(128bit) / 해시 암호화 코드 / 가장 많이 쓰임 / 뚫리긴 뚫림

 

SHA-1

(160bit) / MD5를 보다 높은 bit를 활용하여 사용하는 방식 / 뚫리긴 뚫림

 

SHA-2

SHA-1에서  bit수는 개발자가 직접 정할 수 있게 변경됨 ( 224bit , 256bit , 384bit , 512bit )  / AI가 뚫음 -_- 

 

SHA-3

256,384,512 bit

SHA-2에 특수문자 형태의 코드를 추가

 

=> pw -> MD5 -> SHA 로 두번 꼬아버리는 형태 많이 사용

 

RSA

2048bit

전자서명을 사용하는 형태로 암호화 (Linux에서 최초 개발)

보다 강력(금융권에서 많이 사용)

 

⚡ MD5, SHA-1,SHA-2 ,SHA-3

문자가 길어짐! db 설계시 받을 문자 수 주의!
=> MD5 는 입력하는 텍스트 길이가 길어져도 암호화된 텍스트 길이가 엄청 길어지진 않음
MD5(16진수) : 80~100자
MD5(2진수,5진수) : 150~200자


but SHA부터는 길어질수도 있음 : text로 받음

<body>
	<form id="frm">
		비밀번호 : <input type="text" name="mpass"><br>
		<button type="button" onclick="gopage()">전송</button>
	</form>
</body>
</html>

<script>
function gopage(){
	frm.method = "post";
	frm.action = "./securityok.do";
	frm.submit();
}
</script>

🔽 1234 입력
//web.xml 선언을 하지 않고 사용
@WebServlet("/securityok.do")
public class securityok extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String mpass = request.getParameter("mpass");
		String db = "81dc9bdb52d04dc2036dbd8313ed055"; //db에 저장된 암호
		
		//MD5 - 예외처리해야함
		try {
			//암호화 라이브러리
			MessageDigest md5 = MessageDigest.getInstance("MD5");
			md5.update(mpass.getBytes()); //모든 암호화는 bit형태
			byte[] m = md5.digest();
			
			/*[-127, -36, -101, -37, 82, -48, 77
			  -62, 0, 54, -37, -40, 49, 62, -48, 85] 머 이렇게 출력
			System.out.println(Arrays.toString(m));
			*/
			
			StringBuilder sb = new StringBuilder();
			for(byte w : m) {
				String word = String.format("%x", w);
				sb.append(word);
			}
			System.out.println(sb);
			//81dc9bdb52d04dc2036dbd8313ed055 출력 - 암호화 완
			
			//암호화로 생성된 객체 자료형은 StringBuilder이므로 String으로 형 변환 후 비교
			if(sb.toString().equals(db)) {
				System.out.println("로그인 하셨습니다");
			}else {
				System.out.println("패스워드 틀림");
			}
			
		}catch(Exception e) {
			System.out.println("올바른 문자가 아니므로 암호화 정상작동 실패");
		}
	}
}


문자포맷
%x : 소문자+숫자
%X : 대문자+숫자
=> 16진수 형태의 구성

%02x : 2진수
%05x : 5진수
..원하는대로.. 

머 이런식


해당 () 안에 형식만 바꾸면 됨

//MD5 : 81dc9bdb52d04dc2036dbd8313ed055 출력
MessageDigest md5 = MessageDigest.getInstance("MD5");

//SHA-1 : 7110eda4d09e62aa5e4a390b0a572acd2c220 출력
MessageDigest md5 = MessageDigest.getInstance("SHA1");


//SHA-2부터 - 포함
//SHA-2 : 3ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4 출력
MessageDigest md5 = MessageDigest.getInstance("SHA-256"); 

//SHA-3 : b0f3dc43a9c5c5f67651a8c9108b4c2b98e7246b2eea14cb204295 출력
MessageDigest md5 = MessageDigest.getInstance("SHA3-224");

 

 

 

'CLASS > SERVLET' 카테고리의 다른 글

#9-2 / 보안2  (0) 2024.07.05
web.xml 선언을 하지 않고 사용  (0) 2024.07.05
로그인 - 자동저장  (0) 2024.07.03
#8-2 / 게시판 insert 모듈화...  (0) 2024.06.21
#8-1 / 게시판  (0) 2024.06.21