해쉬와 같은 단방향 암호화 알고리즘은 다양한 보안영역에 활용된다.
그 활용의 하나로 해쉬 알고리즘을 이용한 패스워드 암호화 방법에 대해서
설명하고자 한다.
최근 개인정보보호에 대한 이슈가 더욱 즁요하게 제기되면서 사용자패스워드와 같은
정보를 암호화하여 정보상에 유통하고 이를 안전하게 보관해야하는 것이 필수 조건이다.
개인의 패스워드를 입력받아 서버를 통하여 데이터베이스까지 안전하게 전송하기 위해서는
데이터 구간의 암호화가 필수이지만 해쉬 알고리즘을 잘 이용하면 구간 암호화를 굳이 사용하지
않고도 이러한 효과를 얻을 수 있다.
다음의 시나리오는 실제 구현한 프로세스이다.
<해쉬알고리즘을 이용한 패스워드 암호화 시나리오>
1. A라는 쇼핑몰 홈페이지에서 입력받은 패스워드를 해쉬한다
HTML>
<HEAD>
<script language=javascript src="sha1.js"></script>
<SCRIPT LANGUAGE="JavaScript">
<!--
function AS(s){
//var s = form.A.value;
alert(s);
s =b64_sha1(s);
alert(s);
}
</SCRIPT>
</HEAD>
<BODY>
<FORM Action="biz.xxx">
<INPUT TYPE="password" NAME="A">
<input type=button value="전송" onClick=AS(this.form.A.value)></P>
</FORM>
</BODY>
</HTML>
이 홈페이지소스에는 sha-1 알고리즘이 구현된 자바스크립트를 포함하였다.
2. 사용자가 A쇼핑몰에 회원으로 신규가입하였다면 해쉬된 패스워드를 DB에 저장하고
정당한 회원인지 확인하는 로직을 다음과 같이 구현한다.
//클라이언트에서 전송된 해쉬된 패스워드
String passwordFromClient = "2yXy/BTNLSseevMHJB9Uj7A8MSo=";
//DB에 저장된 패스워드
String passwordFromDB= "2yXy/BTNLSseevMHJB9Uj7A8MSo=";
//물론 String 값이 동일한지 비교해도 무방하지만 다음의 비교 로직으로 수행하는것이 보다 안전
byte[] bytePasswordFromClient = Base64.decodepasswordFromClient);
byte[] bytePasswordFromDB = Base64.decodepasswordFromDB);
boolean flag = true;
for(int i=0; i < bytePasswordFromClient.length; i++){
if(bytePasswordFromClient.length!=bytePasswordFromDB.length){
flag = false;
break;
}
if(bytePasswordFromClient[i]!=bytePasswordFromDB[i]){
flag = false;
break;
}
}
해쉬 알고리즘을 이용하여 패스워드를 암호화를 하게되면 사용자 이외의 누구도 실제 패스워드를
알 수 없다는 것이 보안상의 큰 장점이 된다.
단, 패스워드를 사용자만 알 수 있기 때문에 사용자가 패스워드를 잃어버렸을 경우 본인확인
과정을 거쳐 패스워드를 초기화(재등록)해주는 프로세스를 만들어 주는 친절이 필요하다.
스크랩:http://blog.paran.com/blog/detail/postBoard.kth?blogDataId=28216007&pmcId=javacipher&totalCount=13&preViewPage=0&ajaxPage=1&preFBlogId=35385570&preLBlogId=27788506&pageStyle=null&myCateId=0&yearMonth=null&rDay=null&style=Board&p_eye=