해시함수 / bcrypt / dotenv

길고 꾸준하게·2022년 5월 26일
0
post-thumbnail

해시함수

임의의 길이를 갖는 데이터에 대해 고정된 길이의 데이터로 매핑하는 함수.
해시함수를 거쳐 나온 고정된 길이의 데이터를 해시값이라고 한다.

따로 암호화 키를 받지 않기때문에 고정된 입력값에 항상 고정된 해시값이 나오게된다.

특징을 살펴보자면

  • 단방향 : 입력값을 해시값으로 출력하는것 밖에 안됨. 반대의 과정은 안됨.
  • 눈사태 효과 : 입력값의 극히 일부만 변경되어도 출력되는 해시값은 엄청나게 변함

하지만 입력값이 같으면 출력되는 해시값이 같다는점을 이용한 '레인보우 테이블' 이란게 있다.
간단하게 해시함수를 사용하여 만들어 낼수 있는 값을 대량으로 저장한 표다.
즉 이를보고 원본의 데이터를 찾아낼 수 있다는건데 이것때문에 'Salt'가 생겼는데

Salt는 해시함수의 입력값에 추가로 들어가는 작은 '랜덤' 데이터다.
말그대로 입력값에 소금을 친다는 느낌이다. 랜덤데이터로 들어가기때문에 아무리 레인보우테이블에서 찾아도 입력값이랑 맞기에는 쉽지 않을것이다.


해시함수를 이용한 예를들자면,

우리의 DB에 유저정보를 저장한다고 하면. 유저에 password는 민감정보일텐데 이를 암호화된값이 아닌값을 그대로 넣으면. db의 접근이 가능한 자들은 모두 유저의 password를 캘수있다

그래서 유저의 암호를 해시함수를 거친 해시값으로 db에 저장을하는거다!

유저의password + salt -> (해시함수) -> 해시값.

이걸도와주는 node.js의 라이브러리가 node.bcrypt.js다

bcrypt(비크립트)

// hash

import bcrypt from 'bcrypt'

const hashValue = bcrypt.hash(input,saltRounds,callback)
//or
cosh hashValue = await bcrypt.hash(input,saltRounds)

bcrypt는 promise를 지원하기때문에 async/await도 쓸수있다. 이경우 당연히 callback은 생략되어도 될거다.

  • saltRounds : 'salt'를 붙이고 해쉬를 반복할 수를 정해준다
    (해시함수를 통해 나온 해시값을 또 해시함수를 돌리고 .. 이 반복 수를 정해준다고 이해했다)
    하지만 높을수록 해시를 계산하는데 시간이 늘어나기때문에 성능이슈가 있을수있다
    10~12를 권장한다고 한다

.hash(password,saltRound,callback) or

bcrypt는 promise에서 사용가능한 모든 promise구현을 사용하기때문에 async/await도 가능하겠지

check

놀랍게도 'salt'를 추가해줘서 해시함수를 돌리는데 check기능이 어떻게있지 싶기도 한데 있다

const match = await bcrypt.compare(input,hash)

//return boolean

마찬가지로 3번째인자에 콜백을 받긴하지만 promise를 지원하기때문에 async/await을 쓰고 콜백은 생략했다.

환경변수

프로세스가 컴퓨터에서 동작하는 방식에 영향을 주는 변수들의 모임

  • os입장에서 프로세스를 실행시키기 위해 참조하는 변수
  • 프로세스는 메모리에 적재된 프로그램을 의미한다 (즉 실행중인 프로그램)

dotenv (.env)

.env파일에서 process.env로 환경 변수를 불러오는 zero 종속성 모듈

  • .env파일을 만들어 환경변수를 저장하고 process.env로 해당 변수들을 로드하게 도와줌
  • mongoDB와 connect할때 필요한 url / session에 필요한 secret key 등 코드단에서 보여서는 안될 녀석들을 환경변수로써 관리해 보안면에 도움을 준다
  • .env 라는 외부 파일을 만들어 접근하는 것 이기 때문에 git(버전관리시스템)등에도 올리면 안될것이다.

.env파일 생성

// in .env

KEY=VALUE

//참조

process.env.KEY = VALUE
  • .env파일은 root경로('/')에 생성해야 dotenv가 자동으로 서치한다. root경로에 설치하지 않았다면 따로 path세팅을 해줘야한다. 대부분 경로세팅때문에 에러가 많이난다고 한다

사용

// common JS
require('dotenv').config({path:path}) //path가 있을시.

// use import in ES6
import 'dotenv/config'
import dotenv from 'dotenv'.config()

이후 process.env.KEY로 참조해서 쓰면 된다

profile
작은 나의 개발 일기장

0개의 댓글