웹 개발/웹 개발

SHA-256 암호화 하기

크리스피코드 2022. 12. 24. 22:57

암호화

이름 그대로 입력받은 문자열을 암호로 바꾸어 알아볼 수 없게 만드는 일을 말한다.

보통 개인정보나 중요한 정보들을 보호하기 위해 사용한다.

 

내 경우에는 익명 게시판을 제작하려고 한다. 익명 게시판이기 때문에 게시글의 수정 / 삭제 권한을 확인할 방법을 따로 마련해야한다. 이를 위해 게시글 작성자는 게시글을 작성할 때 본인 확인을 위한 비밀번호를 추가로 작성한다.

 

이번 실습에서는 이 비밀번호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에 저장된 비밀번호와의 비교를 마친 뒤 사용자가 게시글을 수정 / 삭제를 할 수 있는지 여부를 결정하게 된다.

 

나의 경우에는 익명 게시판의 게시글 비밀번호를 위해 암호화를 사용했지만 사이트 회원의 비밀번호암호화하여 저장하는 방법으로 사용할 수 있다.