[Server] 암호화와 Hashing 기본

암호화

// 단순한 수준의 암호화
const shiftBy = (content, offset) => {
  return content.split("").map(letter => {
    return String.fromCharCode(letter.charCodeAt() + offset)
  }).join("")
}

shiftBy("cat", 2) // "ecv"
shiftBy("cat", -2) // "cat"
  • 암호화(encryption) : 일련의 정보를 임의의 방식을 사용하여 다른 형태로 변환 후 해당 방식에 대한 정보를 소유한 사람을 제외하고 이해할 수 없도록 알고리즘을 이용해 정보를 관리하는 과정

1. Hashing

1) 개념

  • 암호화의 기본으로, 어떠한 문자열에 임의의 연산을 적용하여 문자열로 변환하는 것
  • 항상 똑같은 결과를 내며 사실상 복호화가 불가능
    *1q2w3e4r처럼 뻔한 password같이 레인보우 테이블에 기록된 경우 값을 알 수 있음
  • 해시 충돌 : 경우에 따라 다른 input임에도 똑같은 해시 값이 나올 수 있음
  • 대표적 : SHA1, SHA256(최근 많이 사용)
  • 적용 : 비밀번호에 대한 해시 값이 데이터베이스에 저장
    *데이터베이스가 해킹되더라도 비밀번호 노출 방지

조건

  1. 모든 값에 대해 해시 값을 계산하는 데 오래 걸리지 않아야 함
  2. 최대한 해시 값 중복을 피해야 하며, 모든 값은 고유한 해시 값을 가짐
  3. 아주 작은 단위의 변경이라도 완전히 다른 해시 값을 가져야 함

2) Salt

(1) 개념

  • 암호화해야 하는 값에 어떤 별도의 값을 추가하여 결과를 변형하는 것
  • 암호화만 해놓는다면 해시된 결과가 늘 동일하기 때문에 해시된 값과 원래 값을 테이블(레인보우 테이블)로 만들어 decoding 해버리는 경우도 생김
  • 원본값에 임의로 약속된 별도의 문자열을 추가해 해싱 진행 시 기존 해시 값과 전혀 다른 해시 값이 반환되어 알고리즘이 노출되더라도 원본 값을 보호할 수 있도록 하는 안전장치

    기존

    : 암호화 하려는 값 > 해시 값

    Salt 사용

    : 암호화 하려는 값 + Salt용 값 > 해시 값

(2) 주의 사항

  • Salt는 유저와 패스워드 별로 유일한 값을 가져야 함
  • 사용자 계정을 생겅할 때와 비밀번호를 변경할 때 마다 새로운 임의의 Salt를 사용하여 해싱해야 함
  • Salt는 절대 재사용하지 말아야 함
  • Salt는 DB의 유저 테이블에 같이 저장되어야 함
    *유저가 비밀번호 입력 시 해당 유저의 Salt와 비밀번호를 이용해 다시 해싱해줄 수 있음

좋은 웹페이지 즐겨찾기