Cooka프로젝트/로그인기능

crypto모듈을 사용해 암호화

winhwi 2023. 9. 22. 02:55

✔ 암호화란 ?

웹 개발에서 암호화 모듈 또는 라이브러리를 사용하는 주요 이유는 보안과 개인정보 보호입니다. 암호화는 데이터를 안전하게 전송하고 저장하기 위한 핵심 도구 중 하나입니다.

로컬 환경에서 테스트목적의 프로젝트가 아니라,
외부에 배포+로그인 기능이 존재한다면 비밀번호는 무조건 암호화를 해야합니다.

기본적으로 web개발시 클라이언트의 로그인정보를 데이터베이스에 저장하게됩니다.
기본적인 보안이 되있더라도, 그보안이 뚫린다면 클라이언트의 정보는 노출되게 됩니다.
이런경우를 위해 비밀번호를 암호화해서 클라이언트의 정보가 노출되더라도 확인하기 어렵게 만드는것입니다.

 

 

✔ Crypto

Node.js 에 내장되어 있는 내장 모듈 중 하나로 문자열을 암호화, 복호화, 해싱할 수 있도록 도와주는 모듈입니다.

 

 

crypto모듈을 사용해 password를 입력받아 암호화는 utility 함수를 만들었습니다.

import crypto from "crypto";
export const encodePw = (password: string) => {
     const baseCrypto = crypto
    .createHash(`sha256`)
    .update(password)
    .digest(`base64`);
  console.log("baseCrypto:",baseCrypto);
};
  • createHash 메서드는 해시 함수를 생성합니다. 이 함수는 주어진 알고리즘에 따라 데이터를 해시화합니다. 알고리즘은 해시 함수의 종류를 지정하며, 주로 사용되는 알고리즘에는 MD5, SHA-1, SHA-256 등이 있습니다.
  • update 메서드는 해시 함수에 데이터를 입력합니다. 이 메서드를 호출하여 해시 함수에 데이터를 추가할 수 있습니다.
  • digest 메서드는 최종 해시 값을 생성합니다. 이 메서드를 호출하면 이전에 추가한 데이터를 기반으로 최종 해시가 계산됩니다.

 

 

encodePw("123");

암호화된 문자열이 출력된다.

 

 

 

❌ 하지만 이방법은 좋지않은 암호화 방법이다.

그 이유는 클라이언트의 비밀번호가 같을때, 암호화된 비밀번호 또한 같아진다.

이렇게되면 비밀번호를 유추하기 쉬워진다.

그렇기때문에 Salt암호화를 해야합니다.

 

❗ Salt 암호화란?

Salt는 동일한 비밀번호를 가진 클라이언트들의 해시가 서로 다르게 됨으로써 비밀번호 공격에대한 방어기능을 제공합니다.

Salt를 사용하면 각 사용자의 비밀번호에 고유한 값을 추가하여 침입을 방지합니다.

SALT + PASSWORD => DIGEST

 

 

 

 

랜덤바이트를 생성하여 Salt를 생성

import crypto from "crypto";
export const createSalt = () => {
  //crypto.randomBytes( size, callback )
  crypto.randomBytes(32, (err, buf) => {
    if (err) {
      console.log("createSalt Error:", err);
      return;
    }
    const salt = buf.toString("base64");
    console.log("생성된salt:", salt);
    return salt;
  });
};

"base64"는 Digest(해시값)를 표현하기위한 인코딩 방식입니다.

 

 

 

간단한 예제

//salt암호화를위해 수정된 encodePw함수
import crypto from "crypto";
export const encodePw = (salt: string, password: string): string => {
  const baseCrypto = crypto
    .createHash(`sha256`)
    .update(salt + password)
    .digest(`base64`);
  console.log("baseCrypto:", baseCrypto);
  return baseCrypto;
};
//회원정보입력후 가입하기를 눌렀을때 작동하는 함수
import axios from "axios"
const Join= async() => { 
    const salt = await createSalt();
    const encodePassword = encodePw(salt,password) // 회원가입시 입력받은 password입력
    axios.post(`url/users`,{
        login_id:id // 입력받은id
        login_pw:encodePassword // 암호화된 비밀번호
        salt:salt //개인고유의 salt값
    })
}

데이터베이스에 사용자마다의 salt값과 암호화된 비밀번호를 저장합니다.

로그인할때는 입력받은 사용자의 id의 정보가 있다면 입력받은 password와 id정보의 salt를 encodePw()함수를 사용하여 해당 유저의 login_pw값과 비교하시면 됩니다!

'Cooka프로젝트 > 로그인기능' 카테고리의 다른 글

express-session 이용한 로그인 구현  (0) 2023.09.21
session 이란 ?  (0) 2023.09.18