본문 바로가기

[Project] 프로젝트 삽질기40 (feat 해시)

어가며

현재 작성된 코드는 어떤 문제가 있는지 살펴보고 싶었습니다. 리팩터링 하면서, AWS SQS를 활용했는데, 그 과정에서 문제를 하나 발견했습니다. FIFO Queue를 활용하기 위해 Producer에서 deduplicationId를 활용해야 했는데, 이때 deduplicationId 값은 중복되어서는 안 됐습니다. 그럼 deduplicationId 값에 중복되지 않는 값을 넣기 위해 어떻게 해야 할까를 고민하는 과정에서 해시 함수를 활용하면 좋겠다고 생각했습니다. 그럼 어떤 해시 함수를 활용하는 것이 좋을까에 대해 알아보고 싶었습니다. 이 글은 [Back-end] MD5와 SHA의 차이 글을 참고해서 작성했습니다.

 

 

 
 

 


 
 
 
 

 

 

 

 

 

 

해시 함수

해시 함수는 임의의 데이터를 입력받아 고정된 길이의 비트열로 변환하는 역할을 합니다. 해시 함수에서 Key 값을 Hash로 변환하는 과정을 해싱이라고 합니다. 여기서 해시는 데이터를 다루는 기법 중 하나로 검색과 저장을 빠르게 할 수 있도록 돕는 자료구조입니다. 데이터를 저장할 때 Key-Value 형태로 데이터가 존재하고, Key 값이 배열의 인덱스로 저장되기 때문에 검색과 저장이 빠르게 일어납니다. 

 

이런 해시 함수를 활용하려면 다양한 방법을 이용할 수 있지만 크게 MD5와 SHA에 대해 알아보고자 합니다. 

 

 

MD5

MD5(Message Digest algorithm 5)는 128비트 암호화 해시 함수입니다. 주로 프로그램이나 파일이 원본 그대로인지를 확인하는 무결성 검사 등에 사용됩니다. MD5는 메시지 축약 알고리즘으로 파일의 무결성 검사 용도로도 사용되며, 128비트의 해시함수를 이용해 암호화와 복호화를 하는 데 사용됩니다. 다만 MD5에 결함이 발견되어 SHA로 사용하는 것을 권장하고 있습니다.

 

 

SHA

대표적으로 SHA(Secure Hash Algorithm)은 MD5보다는 안전한 특징이 있습니다. 무엇보다 MD5에는 심각한 보안 문제를 야기할 수 있다고 합니다. MD5에서 공격 방법도 있으며, 다른 데이터에서의 해시 값이 같은 "Collision" 문제도 존재합니다. 대신 SHA 알고리즘은 MD5보다 느리다고 합니다.

 

 

SHA-256

SHA-256은 SHA 알고리즘의 한 종류로서 256비트의 해시 값을 생성하는 해시 함수입니다. SHA-256은 미국의 국립표준기술연구소(NIST)에 의해 공표된 표준 해시 알고리즘인 SHA-2 계열 중 하나이며 블록체인에서 가장 많이 채택되어 사용됩니다.

 

 

 

 

import { Injectable } from '@nestjs/common';
import { IReviewEventHandlerReq } from '@app/review/src/review/interface/IReviewEventHandlerReq';
import { SqsService } from '@ssut/nestjs-sqs';
import { ConfigService } from '@app/common-config/src/config/ConfigService';
import md5 from 'md5';

@Injectable()
export class EventApiModReviewProducer {
  constructor(private sqsService: SqsService) {}

  async modReviewProducer(dto: IReviewEventHandlerReq) {
    return await this.sendMessage(dto);
  }

  private async sendMessage(dto: IReviewEventHandlerReq) {
    const message: any = JSON.stringify(dto);
    const hash = md5(`${new Date()}`);

    try {
      await this.sqsService.send(ConfigService.SqsModReviewQueueNameConfig(), {
        id: 'id',
        body: message,
        groupId: 'modReview',
        deduplicationId: hash,
      });
    } catch (error) {
      throw error;
    }
  }
}

 

 

저는 AWS SQS에서 deduplicationId에 중복되지 않은 값을 넣기 위해 md5 해시 함수를 활용했었습니다. 하지만 MD5의 해시 값이 같은 Collision 문제가 발생할 수 있으니, MD5가 아닌 다른 해시 함수를 사용해야 함을 알 수 있었습니다. 추후에 이 부분도 리펙터링의 대상이 될 수 있음을 배웠습니다. 

 

 

 

 

 

 


 

 

 

 

 

 

 

마치며

앞으로도 팀의 발전을 돕는 개발자가 되기 위해 노력하려 합니다. 팀에 필요한 부분이 무엇일지 고민하면서, 팀에 도움이 된다면, 열심히 공부해서 실무에 적용할 수 있는 개발자가 되기 위해 노력하고 싶습니다. 팀의 성장에 기여할 수 있는 개발자가 되겠습니다. 

 

 

 

 

 


 

 

 

 

 

 

참고 및 출처

 

[Back-end] MD5와 SHA의 차이

MD5와 SHA

velog.io

 

[Back-end] Hash algorithm

Hash는 크게 Hash, Hash functiong, Hashing, Hash table로 4가지로 나뉘어진다.

velog.io

 

[Node.js] MD5 를 이용해 Hash 암호화하기

https://www.npmjs.com/package/md5 ✨ 설치 사용할 폴더 내에서 터미널 열고 npm install md5 입력 🔆 사용 app.js에 const md5 = require("md5"); 추가 가입할 때 POST로 받은 password를 md5로 감싸서 has..

honeypot.tistory.com

 

[보안] 비밀번호 암호화를 어떻게 할까?

들어가며 회원 가입을 할 때, 입력받은 비밀번호를 암호화합니다. 이때 저는 항상 bcrypt를 사용했습니다. 그렇게 개발하던 중, 암호화하는 수단은 bcrypt 말고도 crypto도 활용할 수 있다는 것을 알

overcome-the-limits.tistory.com