SHA(Secure Hash Algorithm, 안전한 해시 알고리즘) 함수들은 서로 관련된 암호학적 해시 함수들의 모음입니다.
간단하게 요약하면
패스워드는 사용자 본인만 알아야 하므로 암호화 할때도 복호화가 불가능한 단방향 방식으로 암호화 해야한다.
즉, 시스템관리자나 개발자라도 해당 시스템을 이용하는 개인의 비번을 복호화해서 알아낼수 없도록 조치해야 한다는 말이다. 이때 사용하는 암호화 알고리즘이 SHA-2(Secure Hash Algorithm 2)이다.
해시 함수가 출력하는 암축된 문장을 다이제스트(Digest) 라고 하는데, SHA-2가 생성하는 다이제스트 출력 길이는 224, 256, 384, 512 bit로 다양하다.이때 256bit의 출력 길이를 갖는 SHA-2을 SHA-256이라고 부른다.
여기서 SHA-256 단방향 방식이다. 즉 암호화는 가능하고 복호화 불가능하다.
JAVA에서 SHA-256 적용 예시
// 암호화 함수
public String SHA256Encrypt(String password){
StringBuffer hexString = new StringBuffer();
try {
MessageDigest digest = MessageDigest.getInstance("SHA-256");
byte[] hash = digest.digest(password.getBytes("UTF-8"));
for(int i=0; i < hash.length; i++){
String hex = Integer.toHexString(0xff & hash[i]);
if(hex.length() == 1) hexString.append('0');
hexString.append(hex);
}
}catch(SecurityException e){
throw new DisabledException("SecurityException");
}catch(Exception e){
throw new DisabledException("SHA256Encrypt : 암호화 실패하였습니다.");
}
return hexString.toString().toUpperCase();
}
// 로그인함수
@RequestMapping(value = "/login", method = {RequestMethod.GET, RequestMethod.POST})
public String login(HttpServletRequest request, HttpServletResponse response) throws Exception{
String returnVal = false;
String loiginId = request.getAttribute("LOGIN_ID");
String password = request.getAttribute("LOGIN_PASSWORD");
Map<String, Object> loginCheckMap = new HashMap<String, Object>();
loginCheckMap.put("LOGIN_ID", loiginId);
loginCheckMap.put("LOGIN_PASSWORD", SHA256Encrypt(password));
Map<String, Object> loginInfo = loginService.loginCheck(loginCheckMap);
if (loginInfo) {
returnVal = true;
} else {
returnVal = false;
}
return returnVal;
}