ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • #Node.js // bcrypt 모듈 암호화 사용 방법을 알아보자
    Node.js 2023. 11. 16. 23:22

    # bcrypt란? 

    hash 함수를 이용해 정보를 암호화 할 수 있도록 해주는 Node.js 패키지가 바로 Bcrypt입니다.

     


    # bcrypt의 필요성 

    암호화 방법에는 여러가지가 있습니다. 

    ** D5 방식의 해시 함수

    빠르게 처리되지만 보안 측면에서 취약합니다. MD5와 같은 알고리즘은 더 이상 안전하지 않다고 알려져 있습니다. 해시 충돌이 발생할 가능성이 있어 해킹에 취약합니다. 

    ** SHA 방식의 해시 함수

    안전성이 높지만, 가장 큰 단점은 암호화하는데 시간이 많이 걸린다는 단점이 있습니다. 더 안전한 해시 알고리즘인 SHA-256, SHA-512등을 사용할 수 있지만, 계산량이 많아질수록 처리 속도가 느려집니다. 

    ** 공유 메시지(salt)추가 방식

    간단한 해시 함수만으로는 보안이 취약할 수 있기 때문에, 비밀번호에 임의의 salt(고유한 무작위 값)을 추가하여 해킹을 어렵게 만듭니다. 하지만 완전히 막아주지는 못합니다. 

    ** bcrypt알고리즘_우리가 오늘 배울 좋은 기능입니다.

    사용자가 보안 수준과 처리 속도를 조절할 수 있습니다. 이 알고리즘은 비밀번호 해시에 걸리는 시간을 인위적으로 늘리는 기능이 있어, 보다 안전한 암호화를 제공하면서도 사용자가 처리 속도를 선택할 수 있습니다. 

     

    이러한 방법들은 보안과 속도 사이에서 적절한 균형을 유지하면서 비밀번호를 안전하게 저장하고 처리하는데 사용됩니다. 각 방법의 선택은 보안 요구사항과 성능 사이의 최적의 균형을 찾는데 중요합니다.


    # bcrypt의 사용법 

    **bcrypt 설치하기 

    npm i bcrypt

    ** 비밀번호 만들고 암호화 하기 

    // 데이터베이스에 비밀번호를 저장할 때
    // import bcrypt from 'bcrypt'; => es6모듈
    
    const salt = await bcrypt.genSalt(10); // 기본이 10번이고 숫자가 올라갈수록 연산 시간과 보안이 높아진다.
    const hashed = await bcrypt.hash('135790', salt); // hashed를 데이터베이스에 저장한다.

    ** 비밀번호 만들고 암호화 하기 

    //password 확인할 때, 위의 내용과 이어짐...
    
    // 새로 입력한 비밀번호가, 암호화 된 비밀번호와 일치하는지 확인하기
    const validPassword = await bcrypt.compare('12345678', hashed);
    
    // 비밀번호가 일치하면 true, 일치하지 않으면 false를 반환한다.
    console.log("비밀번호 일치 여부 : "validPassword);

    # bcryp를 한번 적용해보자!

    ** bcrypt 코드 TEST를 위한 test.js 파일 생성(저는 이미 적용해서 다시 파일을 만들었습니다.)


    ** bcrypt 설치하기


    ** bcrypt 설치완료 package.json에서 확인하기


    ** bcrypt 코드 작성하기 


    ** bcrypt 실행하기

    * 사용자가 제공한 비밀번호 === 저장된 곳에 있는 해시된 비밀번호 일치할 때 

     

    * 사용자가 제공한 비밀번호 !== 저장된 곳에 있는 해시된 비밀번호 불일치할 


    ** 코드 분석 

    const salt = await bcrypt.genSalt(10);

    * 여기서 genSalt(10)이란? 

    `bcrypt.genSalt(round)` 함수는 bcrypt 라이브러리 메서드 중 하나로, 해시 함수에 사용되는 salt(임의의 추가 데이터)를 생성합니다. salt는 해싱된  비밀번호의 보안성을 높이기 위해 사용합니다. 

     

    `rounds` 매개변수는 salt 생성에 사용되는 요소입니다 . 숫자가 클수록 salt를 생성하는데 걸리는 시간이 더 오래 걸리지만, 보안성이 높아집니다. 일반적으로 10 이상의 숫자를 사용합니다.

     

    위의 코드에서 `await bcrypt.genSalt(10)`은 비동기 방식으로 솔트를 생성하며, `await`는 비동기 작업이 완료될 때까지 기다립니다. salt가 생성되면 해당 솔트를 변수 `salt`에 저장하여 나중에 비밀번호 해싱에 사용될 수 있습니다.

     

    * 그럼 해싱은 뭘까? 

    해싱은 데이터를 고정된 크기의 고유한 문자열로 변환하는 암호화 기술입니다. 이 변환된 문자열은 원래 데이터를 보호하며, 일관된 방식으로 동일한 입력에 대해 항상 동일한 출력을 생성합니다. 주로 비밀번호 보안, 데이터 무결성 검사, 고유한 데이터 식별에 사용됩니다. 이는 원래 데이터를 다시 복원하기 어렵게 만들어 보안을 강화합니다. 


    const hashed = await bcrypt.hash('12345678', salt);

    `bcrypt.hash('12345678', salt )`은 bcrypt 라이브러리의 메서드 중 하나로, 주어진 비밀번호 ('12345678' 이라 가정)를 해시화하는 작업을 수행합니다. 

     

    여기서 '12345678'은 해싱할 원본 비밀번호입니다.

    `salt`는 앞서 생성된 salt 값으로, 해시 함수에 대한 추가적인 보안성을 제공합니다. 

     

    ` bcrypt.hash( ) ` 함수는 주어진 비밀번호를 해시화하여 보안적으로 안전한 해시 값으로 변환합니다. salt 값이 함께 사용되므로 같은 비밀번호라도 다른 salt를 사용하면 다른 해시 값이 생성됩니다. 이것은 같은 비밀번호라도 저장된 해시 값이 다양하게 나타나도록하여 보안을 강화하는데 도움을 줍니다. 


    const validPassword = await bcrypt.compare('12345678', hashed);

     

    `bcrypt.compare('12345678', hashed)`는 bcrypt라이브러리 메서드 중 하나로, 주어진 비밀번호  ('12345678' 이라 가정)와 해시된 비밀번호(`hashed`)를 비교하는 작업을 수행합니다. 

     

    `'12345678'`은 비교하려는 사용자가 제공한 비밀번호입니다. 

    `hashed`는 데이터베이스나 저장된 곳에 있는 해시된 비밀번호입니다. 

     

    ` bcrypt.compqre( ) ` 함수는 입력된 비밀번호와 저장된 해시 비밀번호를 비교하여 일치하는지 여부를 확인합니다. 만약 두 값이 일치하면 `ture`를 반환하고, 일치하지 않으면 `false`를 반환합니다.

     

    비밀번호 인증과정에서 사용자가 입력한 비밀번호를 다시 해싱하여 저장된 해시 비밀번호와 비교함으로써, 사용자가 제공한 비밀번호가 정확한지 확인할 수 있습니다. 

     

     

Designed by Tistory.