티스토리 뷰

인증 (Authentication)

  - 서비스를 이용하려는 사용자가 인증된 신분을 가진 사람이 맞는지 검증하는 작업.

    (신분증 검사, 로그인(id, pw))

 

인가 (Authorization)

  - 이미 인증된 사용자가 특정 리소스에 접근하거나 특정 작업을 수행할 수 있는 권한이 있는지를 검증하는 작업.

    (인증된 사용자 즉, 로그인된 사용자만 게시글을 작)

 

해싱(Hashing)

  - hash의 단어를 보면 저미다, 다지다, 잘게 썰다 || 감자 === 해쉬브라운 (재료와 맛은 같지만 모양이 같이 않다)

  - 123같은 text가 주어지면 특정 알고리즘을 통해 ffewewu787ew이런식으로 인간이 해독하지 못하는 문자열로 변형하는 것.

  - 감자를 해쉬브라운으로 만들순 있지만 해쉬브라운을 감자로 만들수 없는것처럼 단방향의 특징을 가지고 있음.

  - 동일한 입력값에 동일한 출려값을 가짐.

  - 입력값의 아주 일부분만 변경되어도 전혀 다른 결과 값을 출력.

 

 

Bcrypt

■ 레인보우 테이블 공격 방지를 위해 솔트(Salt)를 통합한 적응형 함수 중하나.

■ SHA 종류의 암호화는 GPU연산에 유리한 32비트 논리 및 연산만 사용하기 때문에 GPU연산을 이용한 공격에 취약하며

    많은 메모리를 필요로 하지 않기 때문에 Blowfish를 이용하여 구현.

■ 입력 받은 데이터를 특정 암호화 알고리즘을 이용하여 암호화 및 검증을 도와줌.

■ 단방향 암호화를 통하여 특정 문자열로 변환한뒤 입력된 비밀번호가 암호화된 문자열과 일치하는지 비교를 통하여

   비밀번호가 옳은지 검증.

* 레인보우테이블

더보기

레인보우테이블

  -  해시 함수(MD5, SHA-1, SHA-2 등)을 사용하여 만들어낼 수 있는 값들을 대량으로 저장한 표

  - MD5 암호화가 쉽게 복호화될 수 있다는 것을 보여준 해킹기법 중 하나

  - 하나의 패스워드에서 시작해 변이된 형태의 여러 패스워드를 생성하여 그 패스워드의 해시를 고리처럼 연결해 일정 수의 패스워드와 해시로 이루어진 테이블

  -  해시함수를 이용하여 저장된 비밀번호로부터 원래의 비밀번호를 추출해 내는데 사용

자세한 내용

* 솔트( Salt )

더보기

Salt  : 아주 작은 임의의 랜덤한 텍스트 

 

Hash의

  - 동일한 입력값에 동일한 출려값을 가짐.

  - 입력값의 아주 일부분만 변경되어도 전혀 다른 결과 값을 출력.

이런 취약점을 보완하기 위해 사용.

 

실제 비밀번호에 Salt라는 랜덤한 값을 추가해서 Hash Text를 구하는 법.

1. 123 → Hashing  Hashed Text

2. 123 + salt Hashing Hashed Text이면 

 

1. A665A45920422F9D417E4867EFDC4FB8A04A1F3FFF1FA07E998E86F7F7A27AE3

2. 5CAC0A318669FADFEE734FB340A5F5B70B428AC57A9F4B109CB6E150B2BA7E57

이렇게 같은 비밀번호 일지라도 Salt를 추가 해줌으로써 전혀 다른 Hashed Text가 생성되어 비밀번호를 유추하기 어렵게 합니다.

 

Bcrypt 사용하기

모듈 설치

npm install bcrypt

 

모듈 사용 import

import bcrypt from "bcrypt"; // 단방향 암호화 (비밀번호 암호화)

// 또는

const bcrypt = require('bcrypt');

 

 

비밀번호 암호화 하기

import bcrypt from 'bcrypt';

const password = 'coriny'; // 사용자의 비밀번호
const saltRounds = 10; // salt를 얼마나 복잡하게 만들지 결정합니다.

// 'hashedPassword'는 암호화된 비밀번호 입니다.
const hashedPassword = await bcrypt.hash(password, saltRounds);

// 해쉬된 비밀번호 데이터베이스에 추가
await prisma.users.create({
    data: {
      email,
      password: hashedPassword, //암호화된 비밀번호 저장.
    },
  });

 

 이렇게 추가까지 하게 된다면 유저의 정보를 적은 비밀번호는

이렇게 해싱된 비밀번호로 들어가는걸 볼수 있습니다.

 

 

클라이언트에서 입력된 비밀번호와 DB에 저장된 비밀번호 비교

import bcrypt from 'bcrypt';

const password = 'coriny'; // 사용자가 입력한 비밀번호
const hashed = '$2b$10$zFu1TDQgN/7hpFQ/csGSb.SFRf3IubI29lwT.BITratXzzEJgC1rq'; // DB에서 가져온 암호화된 비밀번호

// 'result'는 비밀번호가 일치하면 'true' 아니면 'false'
const result = await bcrypt.compare(password, hashed);

console.log(result); // true

// 비밀번호가 일치하지 않다면, 'false'
const failedResult = await bcrypt.compare('FailedPassword', hashed);

console.log(failedResult); // false

// 이부분을 활용하면
// 사용자가 입력한 패스워드와 bcrypt로 변환되어 db에 저장된 암호를 비교가능.
if (!(await bcrypt.compare(password, isExistUser.password))) {
    return res.status(401).json({ message: "비밀번호가 일치하지 않습니다." });
 }
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함