전에 했던 프로젝트의 비밀번호를 암호화해서 저장시키기 위해 암호화에 대해서 공부했습니다.
https://jackycode.tistory.com/94
[JSP] 간단 회원관리 실습
요구조건 loginForm.jsp <%@ page contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %> <% session.invalidate(); %> <!DOCTYPE html> JSP - Hello World 로그인 폼페이지 LOGIN 아이디 비밀번호..
jackycode.tistory.com
비밀번호를 암호화시킬 것이기 때문에 양방향 암호화가 아닌 단방향 암호화 방식을 사용하여서 암호화를 시켰다.
단방향 알고리즘인 SHA알고리즘은 선택했습니다.
SHA -256은 단방향 암호화 방식이기 때문에 복호화가 불가능하다는 것이 큰 특징이며, 복호화를 하지 않아도 되기 때문에 속도가 빠른 장점이 있습니다.
SHA (Secure Hash Algorism)
미국 국가 안전 보장국 (NSA)에서 개발하였습니다. 1993년에 최초 개발된 함수는 SHA-0로, 후에 SHA-0를 변형한 함수는 SHA-1으로, 그 후에 발표된 SHA-224, SHA-256, SHA-384, SHA-512를 묶어서 SHA-2라고 합니다. SHA-1이 가장 많이 쓰이며, TLS 및 SSL, IPSec에서 사용합니다. SHA-0과 SHA-1는 최대 160bit의 고정길이로 요약하고, SHA-2는 사용 함수의 뒤 숫자만큼 가능합니다. SHA는 MD5보다는 느리지만, 강화된 보안을 제공하므로 많이 사용합니다.
해쉬 된 Verification Data 또는 MAC은 복호화가 되지 않으므로 수신자는 원문을 같은 방법으로 해쉬 합니다. 그래서 해쉬 된 값을 비교하여 결과를 확인합니다.
JAVA단에서 암호화시키기
SHA암호화를 사용하려면 java.security.MessageDigest 클래스를 임포트 해야 합니다.
import java.security.MessageDigest;
public String encrypt(String text) throws Exception {
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(text.getBytes());
return bytesToHex(md.digest());
}
private String bytesToHex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for (byte b : bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}
SHA256 sha256 = new SHA256();
String pw='qwer';
pw=sha256.encrypt(pw);
String sql="INSERT INTO member (ID,PW,EMAIL,NAME,birthday,hobby,intro) VALUES (?,?,?,?,?,?,?)";
위와 같은 쿼리문을 사용하여 암호화된 비밀번호 값을 넘기면 아래와 같이 결과 값이 나오게 된다.

DB 단에서 암호화시키기(오라클)
우선 오라클에서 제공해주는 암호화 함수를 사용하려면 권한을 부여해야 한다.
권한을 부여해주려면
sys as sysdba로 접속합니다
그다음
SQL> grant execute on dbms_cryoto to 유저이름;
함수 사용법:
SELECT RAWTOHEX(DBMS_CRYPTO.HASH(TO_CLOB(TO_CHAR('암호화할 내용')), 파라미터)
FROM DUAL;
파라미터에 들어가는 내용은 암호화하는 알고리즘을 정하는 것입니다.
1= MD4
2=MD5
3=SH1
고로 저는 SHA 방식을 사용할 것 임으로 파라미터에 3 값을 준다
String sql="INSERT INTO member (ID,PW,EMAIL,NAME,birthday,hobby,intro) VALUES (?,RAWTOHEX (DBMS_CRYPTO.HASH(TO_CLOB(TO_CHAR(?)),3)),?,?,?,?,?)";

이렇게 두 개 방식으로 암호화를 시켜봤는데 그러면 자바에서 암호화시켜서 DB에 저장하는 것이 좋을까 아니면 DB 단에서 함수를 사용해서 암호화시키는 것이 좋을까?
알아본 결과 이 질문에 대한 대답은 딱 한 가지로 답이 귀결되진 않는 거 같다. 애플리케이션의 서버를 완전히 제어하는지 위협 수준은 또 어느 수준인지 민감한 데이터가 그 수준에서 어떻게 손상되는지 DB를 제어할 수 있는지 DB 제어 권한을 가지고 있는지 등등의 다양한 위협 유형에 따라 달라집니다.
개발자들의 의견들을 찾아보면 보통 자바단에서 암호화를 많이 한 다곤 합니다. 그들이 말하는 대표적인 이유는 자바를 걸쳐서 DB로 데이터가 흘러들어 가는데, 코드 중간에 암호화되지 않은 상태의 데이터가 돌아다니지 않게 하기 위해서 라곤 합니다.
하지만 이 의견들 마저 오래돼서 정확한 의견인진 의문이지만 저도 이들을 따라 자바단에서 암호화하는 것으로 결정했습니다.
참고:
Where should encryption occur - at application or database level?
In order to protect sensitive data of a web-application the question arises whether it is best practice to encrypt on application level using jasypt (for Java) and save encrypted data to the databa...
stackoverflow.com
'몰입형학습' 카테고리의 다른 글
| web.xml 정리 (0) | 2022.09.16 |
|---|---|
| HTTPServlet 클래스 (0) | 2022.09.15 |
| HTTP 와 HTTPS 차이 (4) | 2022.09.15 |
| HTTP 상태코드 (0) | 2022.09.15 |
| [JAVA]멀티캐스팅을 이용한 채팅 프로그램 (0) | 2022.09.06 |
댓글