1. Salt
단방향 암호화인 해시함수로 비밀번호 암호화를 진행할 때, 해킹가능한 확률이 높아지므로,
해시함수를 돌리기 전에 원문에 임의의 문자열을 덧붙이는 것을 말한다.
단어 뜻 그래도 원문에 임의의 문자열을 붙인다는 의미의 소금친다(salting) 이라는 것이다.
같은 비밀번호를 사용하더라도 salt가 다르면 password를 알아내기 힘들다.
2. salt 사용하기
node.js에는 많은 기본제공 모듈이 있다. 그중에서 암호화, 복호화 기능을 제공한 crypto 모듈을 이용해서,
랜덤 스트링을 얻을 수 있는 방법이 있다.
암호화할때 사용할 알고리즘은 sha512, base64, hex 등이 있다.
2-1 회원가입 api
(1) salt 값 만들기
const buf = await crypto.randomBytes(64);
const salt = buf.toString('base64');
randomBytes로 64바이트의 길이 salt를 생성한다.
base64 문자열 salt로 변경해줍니다.
(2) 암호화
const hashedPw = await crypto.pbkdf2(password, salt, 1000, 32, 'SHA512')
const signupResult = await db.queryParam_Arr(signupQuery, [email, hashedPw.toString('base64'),name, phone, salt]);
crypto.pbkdf2( '입력비밀번호' , '기존salt', 반복횟수, 비밀번호길이, 해시알고리즘)
회원가입시, 비밀번호 그리고 salt도 같이 넣어줘야한다.
randonBytes 메소드는 매번 다른 salt값을 생성하기 때문에, 나중에 로그인이나 비밀번호찾기 진행시에 같은 salt값이 필요하다. 같은 salt 값으로 비밀번호를 찾아야 비교가 가능하다.
또한 반복 횟수, 비밀번호 길이, 해시 알고리즘, 인코딩 방식까지 다 같아야 같은 결과가 나온다.
2-2 로그인 api
(1) post에서 이메일, 비밀번호를 받는다
password = req.body.password
const checkuserQurey = "SELECT * from user WHERE email = ?";
const checkuserResult = await db.queryParam_Parse(checkuserQurey, [req.body.email])
(2) 이메일이 같은 경우, 받은 비밀번호 암호화
const salt = checkuserResult[0].salt;
const hashedEnterPw = await crypto.pbkdf2(req.body.password, salt, 1000, 32, 'SHA512')
(3) 이메일정보로 디비에 저장된 비밀번호 가져와서 비교하기
const dbPw = checkuserResult[0].password //저장된 비밀번호
if (hashedEnterPw.toString('base64') == dbPw) { // 비교한다
//맞는 경우, 토큰 생성
'Backend > JavaScript,NodeJS, Express' 카테고리의 다른 글
[AWS] EC2 생성하기 (ssh 이용해 터미널에서 접속하기) (0) | 2021.08.18 |
---|---|
기본 SQL 문 정리 (0) | 2021.08.10 |
MySQL - Express 연결 에러 정리 (0) | 2021.08.10 |
Pool.js 이해하기 (0) | 2021.08.09 |
Maria DB - Express 연결 (Maria DB 설치 및 MYSQL workbench로 접속 및 Express 연결) (0) | 2021.08.05 |