Java / / 2022. 11. 30. 10:38

[React] 비밀번호 암호화 하기 (crypto, sha256)

반응형

 

서론

java + spring 환경에서 사용자가 회원가입 시, 비밀번호를 암호화 해서 DB에 저장해 본적은 있었다.

이번에는 React로 프론트 단에서 Salt(난수)값과 조합하여 비밀번호를 암호화하고 블록체인 쪽으로 넘겨주어야 할 일이 생겼다. 해당 부분은 crypto를 사용하여 간단히 암호화 할 수 있었고, 그 방법을 간단히 정리하려고 한다.

 

🧸 crypto란?

javascript에서 해시 함수를 통한 암호화를 할 수 있도록 해주는 Node.js 패키지

 


 

사용 방법

  • crypto는 Node.js 기본 패키지 이므로 따로 설치할 필요가 없다.

 

🔔 참고 : 단방향  vs  양방향 

Hash 알고리즘 + salt를 활용한 단방향 암호화를 사용할 것이다. 암호화 종류를 아래에 간단히 정리해 두었다.

 

※ 참고로 로그인 용으로 사용할 것이 아니라서, salt값을 따로 DB에 저장하지는 않았다.

사용자 인증이 필요하다면,  암호화가 필요한 테이블에 salt 컬럼을 추가하고 저장해 두어야한다.

그래야 로그인 시, 유저가 입력한 pw와 저장된 salt 값으로 다시 함호화하여 저장된 pw와 일치하는지 확인 할 수 있다.

 

✔ 단방향 암호화 : 복호화(암호화 되기 이전으로 되돌리는 것) 할 수 없는 암호화

  • Hash 알고리즘을 많이 사용한다. (필자 사용)
    • 임의의 문자열을 고정된 길이의 다른 문자열로 변경하는 작업

양방향 암호화 : 복호화 가능한 암호화

  • 대칭형 암호화
  • 비대칭형 암호화

대부분 pw를 찾을 때, 비밀번호를 알려주지 않고 재설정을 하기때문에, 복호화를 할 이유가 없다.

 

salt 암호화

  • salting + key stretching 사용
    • salting - 기존의 문자열에 salt를 붙혀 새로운 문자열을 반환한다.
    • key stretching - 기존 문자열의 digest를 생성하고 다시 digest 한다. (횟수는 상관없으며 key stretching의 차이가 1이라도 나면 pw의 생김새는 완전히 다르게 나온다.)

 

📌 Crypto 모듈 - randomBytes 

  • 64비트 길이의 salt 값을 반환한다.
  • salt는 buffer 형식이기에 toString('base64')로 base64 형태의 문자열로 변경해 주어야 한다.(다른 형태도 가능)
crypto.randomBytes(64, (err, salt) => {
    if (err) reject(err);
    console.log(salt.toString('base64'));
});

 

📌 Crypto 모듈 - pbkdf2

  • pbkdf2(암호화 하고자하는 pw, salt, key Stretching(반복횟수), 출력하고자하는 비밀번호 길이, Hash 알고리즘)
    • 설정에 따라 최종 해시값을 return 해준다.
crypto.pbkdf2(pw, salt, 10, 64, 'sha256', (err, key) => {
    if (err) reject(err);
    console.log(key.toString('base64'));
});

 

📌 최종

  • 여러 곳에서 암호화가 필요하여 필자는 공통함수로 빼서 사용
export const createHashedPassword = (password:string) => {
    crypto.randomBytes(64, (err, salt) => {
        if (err) throw err;
        crypto.pbkdf2(password, salt.toString('base64'), 10, 64, 'sha256', (err, key) => {
            if (err) throw err;
            console.log(key.toString('base64'));
            return key.toString('base64');
        })
    })
}

 


마무리

처음 사용해 보는 거라, 이게 좋은 방법인지는 잘 모르겠다. crypto를 사용하여 간단히 암호화 할 수 있어서 편하긴했다.

아무튼 더 좋은 방법이 있거나 틀린부분이 있다면 알려주시면 감사하겠습니다~

반응형
  • 네이버 블로그 공유
  • 네이버 밴드 공유
  • 페이스북 공유
  • 카카오스토리 공유