SHA-256 암호화 하기
암호화
이름 그대로 입력받은 문자열을 암호로 바꾸어 알아볼 수 없게 만드는 일을 말한다.
보통 개인정보나 중요한 정보들을 보호하기 위해 사용한다.
내 경우에는 익명 게시판을 제작하려고 한다. 익명 게시판이기 때문에 게시글의 수정 / 삭제 권한을 확인할 방법을 따로 마련해야한다. 이를 위해 게시글 작성자는 게시글을 작성할 때 본인 확인을 위한 비밀번호를 추가로 작성한다.
이번 실습에서는 이 비밀번호를 DB에 저장하는 과정에서 사용해보려고 한다.
public String encryptPass(String bPass) {
MessageDigest md = null;
try {
md = MessageDigest.getInstance("SHA-256");
md.update(bPass.getBytes());
} catch (Exception e) {
e.printStackTrace();
}
return bytesToHex(md.digest());
}
SHA-256의 암호화는 java.security.MessageDigest 클래스를 통해 이루어진다.
변환할 문자열을 getBytes() 메서드를 이용해 byte 배열로 변환한 다음,
MessageDigest 클래스의 update() 메서드로 문자열을 암호화 처리한다.
그 다음 digest() 메서드를 통해 결과값을 반환받을 수 있는데
반환값이 10진수 정수 배열이므로 이것을 16진수 문자열로 변환한다.
private String bytesToHex(byte[] bytes) {
StringBuilder builder = new StringBuilder();
for(byte b : bytes) {
builder.append(String.format("%02x", b));
}
return builder.toString();
}
배열에 담긴 정수를 16진수로 변환하여 StringBuilder에 담아놓는다.
변환 작업이 완료되면 해당 메서드는 16진수 문자열을 반환하는데
이 문자열을 데이터베이스에 저장하면 된다.
데이터 간 비교
이후 게시판에 접속한 사용자가 게시글을 수정 / 삭제하기 위해 비밀번호를 입력했을 때 AJAX를 사용해 DB에 저장된 데이터와 비교하게 된다.
SHA-256는 단방향 암호화 알고리즘이므로 복호화(암호화 이전으로 되돌림)가 불가능하다.
그러므로 요청으로 들어온 비밀번호를 암호화하여 DB의 데이터와 비교하는 과정을 거친다.
function checkPass(){
var bPass = $('#modiPass').val();
bPass = bPass.trim();
if(bPass == ""){
alert("비밀번호를 입력해주세요.");
$('#modiPass').val('');
return false;
}
var bId = $('#bId').val();
$.ajax({
url : 'board.do',
data : {
'job' : 'check',
'b_id' : bId,
'b_pass' : bPass
},
type : 'post',
success : function(res){
if(res == "SUCCESS"){
var job = $('#job').val();
location.href="board.do?job=" + job + "&bId=" + bId;
} else {
alert("비밀번호가 일치하지 않습니다.");
$('#modiPass').val('');
}
},
error : function(err){
alert("잠시 후 다시 시도해주세요.");
},
dataType : 'json'
});
}
DB에 저장된 비밀번호와의 비교를 마친 뒤 사용자가 게시글을 수정 / 삭제를 할 수 있는지 여부를 결정하게 된다.
나의 경우에는 익명 게시판의 게시글 비밀번호를 위해 암호화를 사용했지만 사이트 회원의 비밀번호를 암호화하여 저장하는 방법으로 사용할 수 있다.