비밀번호를 안전하게 저장하는 가장 좋은 방법 중 하나는 비밀번호를 소금에 절이고 해시하는 것입니다. 솔팅 및 해싱은 일반 비밀번호를 되돌리기 어려운 고유한 값으로 변환합니다. Bcrypt 라이브러리를 사용하면 매우 적은 노력으로 Node.js에서 비밀번호를 해시 및 솔트 처리할 수 있습니다.

비밀번호 해싱이란 무엇인가요?

비밀번호 해싱은 일반 텍스트 비밀번호를 해싱 알고리즘에 전달하여 고유한 값을 생성하는 것을 의미합니다. 이 고유 값을 해시라고 합니다. 해싱 알고리즘의 몇 가지 예로는 bcrypt, scrypt, SHA가 있습니다.

좋은 해싱 알고리즘의 주요 특성 중 하나는 동일한 입력에 대해 동일한 출력을 생성한다는 것입니다. 이러한 예측 가능성 때문에 해시는 무차별 암호 대입 공격에 취약합니다. 해커는 일반적으로 사용되는 많은 입력값에 대한 해시값을 미리 계산한 다음 이를 목표 값의 해시값과 비교할 수 있습니다. 솔팅을 사용하면 이 취약점을 완화할 수 있습니다.

비밀번호 솔팅이란 무엇인가요?

비밀번호 솔팅은 비밀번호를 해싱하기 전에 임의의 문자열(솔트)을 추가합니다. 이렇게 하면 매번 생성되는 해시가 항상 달라집니다. 해커가 해시된 비밀번호를 알아내더라도 이를 생성한 원래 비밀번호를 알아내는 데 상당한 시간이 걸립니다.

Bcrypt를 사용하여 비밀번호를 해시하고 확인하는 방법

bcrypt 는 Node.js에서 비밀번호를 해시하는 방식을 간소화하는 npm 모듈입니다. 사용하려면 아래 단계를 따르세요:

1단계: Bcrypt 설치

다음 터미널 명령을 실행하여 bcrypt를 설치합니다.

npm 사용:

 npm install bcrypt

yarn 사용:

 yarn add bcrypt

2단계: Bcrypt 가져오기

JavaScript 파일 상단에서 Bcrypt를 가져옵니다.

 const bcrypt = require("bcrypt")

3단계: 솔트 생성

bcrypt.genSalt() 메서드를 호출하여 솔트를 생성합니다. 이 메서드는 비밀번호를 해시하는 데 걸리는 시간을 결정하는 비용 계수인 정수 값을 받습니다. 비용 계수가 높을수록 알고리즘에 더 많은 시간이 걸리고 무차별 암호 대입을 사용하여 암호화된 비밀번호를 되돌리기가 더 어려워집니다.

좋은 값은 비밀번호를 보호할 수 있을 만큼 높으면서도 프로세스 속도가 느려지지 않을 만큼 낮아야 합니다. 일반적으로 5 사이이며 이 튜토리얼에서는 10을 사용합니다.

 bcrypt.genSalt(10, (err, salt) => {
    // use salt to hash password
})

4단계: 비밀번호 해시하기

bcrypt.genSalt 함수에서 일반 비밀번호와 생성된 솔트를 bcrypt.hash() 메서드에 전달하여 비밀번호를 해시합니다.

 bcrypt.genSalt(10, (err, salt) => {
    bcrypt.hash(plaintextPassword, salt, function(err, hash) {
        // Store hash in the database
    });
})

해시를 생성했으면 데이터베이스에 저장합니다. 이 해시를 사용하여 비밀번호를 확인하고 로그인을 시도하는 사용자를 인증합니다.

이 글도 확인해 보세요:  턴키 GNU/Linux로 개인 VPN을 설정하는 방법

소금과 해시를 별도로 생성하는 대신 단일 함수를 사용하여 소금과 해시를 자동 생성할 수도 있습니다.

 bcrypt.hash(plaintextPassword, 10, function(err, hash) {
    // store hash in the database
});

5단계: bcrypt를 사용하여 비밀번호 비교

사용자를 인증하려면 bcrypt.compare() 함수를 사용하여 사용자가 제공한 비밀번호와 데이터베이스에 있는 비밀번호를 비교해야 합니다. 이 함수는 일반 텍스트 비밀번호와 저장한 해시를 콜백 함수와 함께 받습니다. 이 콜백 함수는 발생한 모든 오류와 비교의 전체 결과를 포함하는 객체를 제공합니다. 비밀번호가 해시와 일치하면 결과는 참입니다.

 bcrypt.compare(plaintextPassword, hash, function(err, result) {
    if (result) {
        // password is valid
    }
});

비동기/대기 사용

다음과 같이 비동기/대기를 사용하여 Node.js에서 Bcrypt로 비밀번호를 암호화할 수 있습니다.

 async function hashPassword(plaintextPassword) {
    const hash = await bcrypt.hash(plaintextPassword, 10);
    // Store hash in the database
}

// compare password
async function comparePassword(plaintextPassword, hash) {
    const result = await bcrypt.compare(plaintextPassword, hash);
    return result;
}

프로미스 사용

bcrypt 라이브러리는 프로미스 사용도 지원합니다. 예를 들어, 다음은 then…catch 블록을 사용하여 비밀번호를 해시하는 함수입니다.

 function hashPassword(plaintextPassword) {
    bcrypt.hash(plaintextPassword, 10)
        .then(hash => {
            // Store hash in the database
        })
        .catch(err => {
            console.log(err)
        })
}

마찬가지로, 이 함수는 사용자의 일반 암호와 프로미스를 사용하여 해시된 암호를 비교합니다.

 
function comparePassword(plaintextPassword, hash) {
   bcrypt.compare(plaintextPassword, hash)
       .then(result => {
           return result
       })
       .catch(err => {
           console.log(err)
       })
}

해싱과 솔팅은 쉬운 승리

Bcrypt 라이브러리를 사용하여 Node.js에서 비밀번호를 해싱하고 확인할 수 있습니다. 비밀번호를 해시하면 사이버 범죄자가 일반 비밀번호에 액세스하여 민감한 데이터나 서비스에 액세스할 가능성을 최소화할 수 있습니다.

해시된 비밀번호를 소금에 절이면 더욱 안전해집니다. 해싱 외에도 추가적인 보안 조치로 항상 비밀번호 강도를 확인하세요.

By 박준영

업계에서 7년간 경력을 쌓은 숙련된 iOS 개발자인 박준영님은 원활하고 매끄러운 사용자 경험을 만드는 데 전념하고 있습니다. 애플(Apple) 생태계에 능숙한 준영님은 획기적인 솔루션을 통해 지속적으로 기술 혁신의 한계를 뛰어넘고 있습니다. 소프트웨어 엔지니어링에 대한 탄탄한 지식과 세심한 접근 방식은 독자에게 실용적이면서도 세련된 콘텐츠를 제공하는 데 기여합니다.