Fluent Validation? Bcrypt?

Fluent Validation

유효성 검사 규칙을 작성하기 위해 인터페이스와 람다식을 사용하는 .NET용 유효성 검증 라이브러리.

이전 Node.js에서 사용했던 JOI라이브러리와 비슷한 기능을 한다고 생각하면 된다!

 

시작하기

dotnet add package FluentValidation
더보기

ASP.NET Core 통합인 경우

dotnet add package FluentValidation.AspNetCore

 

실습

using FluentValidation;
using HolyShitServer.Src.Network.Packets;

namespace HolyShitServer.Src.Utils.FluentValidation;

public class RegisterRequestValidator : AbstractValidator<C2SRegisterRequest>
{
  public RegisterRequestValidator()
  {
    RuleFor(x => x.Email)
        .NotEmpty().WithMessage("이메일을 입력해주세요.")
        .EmailAddress().WithMessage("올바른 이메일 형식이 아닙니다.");

    RuleFor(x => x.Nickname)
        .NotEmpty().WithMessage("닉네임을 입력해주세요.")
        .Length(2, 20).WithMessage("닉네임은 2~20자 사이여야 합니다.");

    RuleFor(x => x.Password)
        .NotEmpty().WithMessage("비밀번호를 입력해주세요.")
        .MinimumLength(8).WithMessage("비밀번호는 최소 8자 이상이어야 합니다.")
        .Matches(@"[a-z]").WithMessage("소문자를 포함해야 합니다.")
        .Matches(@"[0-9]").WithMessage("숫자를 포함해야 합니다.")
        .Matches(@"[!@#$%^&*]").WithMessage("특수문자를 포함해야 합니다.");
  }
}

 

Bcrypt

브루스 슈나이어가 설계한 키(key) 방식의 대칭형 블록 암호에 기반을 둔 암호화 해시 함수. Niels Provos와 David Mazières가 설계했다. Bcrypt는 레인보우 테이블 공격을 방지하기 위해 솔팅과 키 스트레칭을 적용한 대표적인 예시이다.

 

솔팅, 키 스트레칭

더보기

솔팅(Salting): 단방향 해시 함수 암호화를 진행 할 때 본래 데이터에 추가적으로 랜덤한 데이터를 더하는 방식이다. 원래 데이터에 추가 데이터가 포함 되었기 때문에 이전의 해시값과 달라진다.

 

키 스트레칭(Key Stretching): 단방향 해쉬값을 계산한 후, 그 해쉬 값을 또 다시 해시하고 또 이를 반복하는 방식이다. 최근 일반적인 장비로도 1초에 50억 개 이상의 해시값을 비교할 수 있다. 하지만 키 스트레칭을 적용하면 동일 장비에서 1초에 5번 정도만 비교할 수 있다. GPU(Graphics Processing Unit)를 사용하더라도 수백에서 수천 번 정도만 비교할 수 있다.

 

구조

$2b$12$76taFAFPE9ydE0ZsuWkIZexWVjLBbTTHWc509/OLI5nM9d5r3fkRG
 \/ \/ \____________________/\_____________________________/
Alg Cost       Salt                        Hash
  • 2b: 해시 알고리즘 식별자.
  • 12: Cost Factor로 Key Stretching의 수. (2의 12승)
  • 76taFAFPE9ydE0ZsuWkIZe: 16Byte 크기의 Salt, Base64로 인코딩된 22개의 문자.
  • xWVjLBbTTHWc509/OLI5nM9d5r3fkRG: 24Byte의 해시 값, Base64로 인코딩된 31개의 문자.

 

검증

Bcrypt는 단방향 해시 알고리즘이므로 복호화가 불가능하다. Bcrypt의 검증은 암호화된 값이 가지고 있는 알고리즘, Cost Factor, Salt를 이용한다.

 

1.비교하고 싶은 평문을 2.암호화된 값이 가지고 있는 알고리즘, Cost Factor, Salt을 이용해 해시를 진행한 후 3.암호화된 값과의 비교를 통해 검증을 진행한다.

 

 

 

 

 

 

 

 

 

 

 

참조) https://velog.io/@yenicall/%EC%95%94%ED%98%B8%ED%99%94%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-Bcrypt

 

암호화의 종류와 Bcrypt

단방향 암호화는 평문을 암호화 할 수는 있지만 암호화된 문자를 다시 평문으로 복호화가 불가능한 방식이다. 주로 해시 알고리즘을 이용하여 단방향 암호화를 구현한다. 단방향 암호화를 사용

velog.io

'Side Projects' 카테고리의 다른 글

Bull Queue?  (0) 2024.12.03
redis cluster 사용해보기  (1) 2024.11.27
redis / ioredis 패키지 비교  (1) 2024.11.18
TCP Multi-Player - 트러블 슈팅  (0) 2024.11.05
ORM / Low-Level Query  (0) 2024.10.29