Space
article thumbnail
반응형

[보안] 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는 기존 입력값에 랜덤 한 문자열을 추가하여 해쉬 하기에

레인보우 테이블을 통해 출력값으로 입력값을 알 수 없다.

 

반응형
profile

Space

@Space_zero

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!