반응형
[보안] Hash & Salt
설치
# js
npm i bcrypt
# ts
npm i bcrypt
npm i @types/bcrypt
반응형
Hash
ex) 1234 -> hashFunction(1234) -> fjd12fdsaasdvsa431
위의 예시처럼 입력값이 무작위의 출력값으로 나온다.
1. 동일한 입력값에 대한 동일한 출력값이 나타난다.
2. 입력값이 약간만 바뀌어도 완전히 다른 출력값이 나타난다.
3. 단방향 함수이므로 출력값을 사용하여 역으로 입력값을 알 수 없다.
DB 등의 노출된 경우, 유저들의 비밀번호를 알 수 없게 하기 위하여 비밀번호 그 자체를 저장하는 것이 아니라, 해쉬 된 비밀번호를 저장한다.
import bcrypt from "bcrypt";
export async function createAccount(prevState: any, formData: FormData) {
const data = {
password: formData.get("password"),
};
const result = await formSchema.safeParseAsync(data);
if (!result.success) {
return result.error.flatten();
} else {
console.log("result data : ", result.data);
// 비밀번호 해싱
const hashedPassword = await bcrypt.hash(result.data.password, 몇번 돌릴 건지 숫자 입력);
// 서버에 저장하기
const user = await db.user.create({
data: {
password: hashedPassword,
},
select: {
id: true,
},
});
}
}
레인보우 테이블
해쉬값(출력값)을 입력값과 연결해 놓은 테이블이다.
어떤 해쉬값을 보내면 입력값을 알 수 있기에 해쉬를 사용하면 레인보우 테이블 공격을 주의해야 한다.
Salt
레인보우 테이블 공격에 대해 보완한 것이 Salt이다.
ex) 1234 -> saltFunction(1234 + 무작위 salt값) -> jkfl1dj2sieqd21mfl31
Salt는 기존 입력값에 랜덤 한 문자열을 추가하여 해쉬 하기에
레인보우 테이블을 통해 출력값으로 입력값을 알 수 없다.
반응형