728x90
반응형
요즘 트렌드는 비밀번호를 DB에 저장하지 않고 해시해서
사용자가 입력한 비밀번호와 저장된 비밀번호의 해시값이
일치하는지 확인하는 것이라고 한다.
일명 단방향 해시
만드는 방법을
예를 들어 비밀번호가
qwer1234 라면
해시를 하면 4d4f26369171994f3a46776ee2d88494fb9955800a5bb6261c016c4bb9f30b56
이런 느낌의 해시값이 나온다.
String password = "qwer1234";
MessageDigest hash = MessageDigest.getInstance("SHA-256");
hash.update(password.getBytes());
byte byteData[] = hash.digest();
StringBuffer sb = new StringBuffer();
for(int i = 0 ; i < byteData.length ; i++){
sb.append(Integer.toString((byteData[i]&0xff) + 0x100, 16).substring(1));
}
String result = sb.toString();
System.out.println(result);
그런데 이 단방향 해시의 문제는
해킹되기 쉽다는거.
비밀번호가 똑같은 사용자의 경우 해시값도 똑같다.
해시방법은 SHA, MD5 등이 있는데
이 해시값이 유출되면 원래 패스워드를 알 수 있다는
치명적인 단점이 있다.
이런..
그래서 단방향해시에 소금을 쳐서
조금 더 보안을 강화하는 방법이 있는데
이름하야 해시솔트
import java.security.MessageDigest;
public byte[] getHash(String password, byte[] salt)
throws NoSuchAlgorithmException{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
digest.update(salt);
return input = digest.digest(password.getBytes("UTF-8"));
}
이 방식은 비밀번호 qwer1234에 솔트인 "a17a0a0b39d83f0b"를 추가하는 방식이다.
해싱할때
SHA-256(salt + 비밀번호)를 해시한 값을 기록하면 된다.
그리고 사용자 테이블에 임의의 salt값도 함께 저장한다.
사용자마다 다른 salt값을 줘서
해싱하면 같은 비밀번호라도 다른 해시값을 얻을 수 있음.
참고로 취약점 검사시
USING_HASH_WITHOUT_SALT
로 나온다.
해킹당하지 말고 미리미리 예방하자
728x90
반응형