encry.java (servlet)
package web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
//Controller
public class encry extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String passwd = "940";
//해당 문자를 base64를 이용하여 encode(암호화)
encry_model em = new encry_model(); //암호화 model 클래스 로드
String result = em.dataencode(passwd); //해당 메소드에 문자값을 전달
System.out.println(result); //최종 암호화된 사항을 출력
//base64로 변환된 문자를 decode(복호화) 이용하여 원본 문자로 변환
String repasswd = "OTQw";
String result2 = em.datadecode(repasswd);
System.out.println(result2);
//=> base64요즘 잘 안쓰임 get으로 보낼때나 이메일에 사용
//md5 암호화 알고리즘
String result3 = em.md5_encode(passwd);
System.out.println(result3);
//md5는 복호화가 불가능 바로 DB에 저장
//사실 해커가 마음먹으면 가능 그래도 base64보다 안전
String result4 = em.sha_encode2(passwd);
System.out.println(result4);
}
}
encry_model.java
package web;
import java.security.MessageDigest;
import java.util.Base64;
import java.util.Base64.Decoder;
import java.util.Base64.Encoder;
//문자를 암호화하는 모델
public class encry_model {
public String dataencode(String word) { //base64 암호화
Encoder ec = Base64.getEncoder();
String security = ec.encodeToString(word.getBytes()); //encodeToString(바이트) => 스트링
return security;
}
public String datadecode(String word) { //base64 복호화
Decoder dc = Base64.getDecoder();
/*
byte dec[] = dc.decode(word);
String security = new String(dec);
*/
byte dec[] = dc.decode(word);
String security = new String(dc.decode(word));
return security;
}
/*MD5 : %02x 기본 == %x, %01
* %03x 부터 변함
* x : 소문자 X : 대문자
*/
public String md5_encode(String word) {
String security = "";
try {
//MessageDigest : 암호화 클래스 구성 형태를 가지고있는 라이브러리
MessageDigest md = MessageDigest.getInstance("md5");
md.update(word.getBytes()); //해당 암호화 기준으로 byte로 문자를 변환
byte md5byte[] = md.digest(); //byte 원시배열에 해당 암호화된 byte들을 저장
StringBuilder sb = new StringBuilder(); //문자열 클래스로 연속저장
for(byte s : md5byte) { //for each를 이용하여 연속 저장
sb.append(String.format("%02x", s));
//%02x : 2자리 문자 => 1234의 경우 01, 02, 03, 04
//%01x : 1자리 문자 => 1234의 경우 1, 2, 3, 4
//%05x : 5자리 문자 => 00001, 00002, 00003, 00004
}
security = String.valueOf(sb);
}catch (Exception e) {
security = "md5 Error!";
}
return security;
}
/*
* 블록체인 기술 사용
* sha-1 : 16진수 40자로 생성되는 암호화 기술
* %01x, %02x, %03x 모두 다름
* sha-2 : sha-224, sha-256, sha-384, sha-512
* sha-3 : sha3-224, sha3-256, sha3-384, sha3-512 //높은 jdk 버전 필요 요즘 많이 사용
*/
public String sha_encode2(String word) {
String security = "";
try {
/* getInstance("sha-1")
* "sha-224"
* "sha-516"
*/
MessageDigest sha = MessageDigest.getInstance("sha-1");
sha.update(word.getBytes());
byte shabyte[] = sha.digest();
StringBuilder sb = new StringBuilder();
for(byte s : shabyte) {
sb.append(String.format("%02x", s));
}
security = String.valueOf(sb);
}catch (Exception e) {
security = "sha Error!";
}
return security;
}
//복합 암호화 기술 => base64 + md5
//복합 암호화 기술 => md5 + sha-2 => 하나뚫는데 22시간 걸림
}
임포트 주의 : Java.util.Base64