취약하거나 위험한 암호화 알고리즘(MD5) 사용

Use of a Broken or Risky Cryptographic Algorithm

설명

MD5처럼 계산이 빠른 해시로 비밀번호를 저장하면 데이터베이스 유출 후 공격자가 많은 후보 비밀번호를 빠르게 시험할 수 있습니다. 해시를 복호화하는 것이 아니라 후보의 해시를 비교하는 공격입니다. 고유한 솔트가 없으면 미리 계산한 해시 목록과 사용자 간 해시 비교도 활용할 수 있습니다.

잠재적 영향

  • 비밀번호 유출(비밀번호 탈취): 공격자가 후보 비밀번호의 해시를 빠르게 비교하여 실제 비밀번호를 알아낼 수 있습니다.
  • 계정 권한 탈취: 공격자가 비밀번호를 알아내어 사용자 계정에 무단으로 접근할 수 있습니다.

해결 방법

  • 비밀번호 저장에 MD5, SHA-1 같은 빠른 해시를 사용하지 마세요.
  • 유지보수되는 Argon2id나 scrypt 구현을 사용하세요. 기존 bcrypt를 유지한다면 입력 길이 제한과 환경에 맞는 계산 비용을 확인하세요.
  • 라이브러리가 고유한 솔트를 생성하게 하고 비용 설정을 해시와 함께 저장하세요. 솔트는 사전 계산과 동일 비밀번호의 해시 비교를 어렵게 하며, 해시 충돌을 방지하는 수단은 아닙니다.

예시

변경 전

javascript
const crypto = require('crypto');

function setUserPassword(user, pwtext) {
  const hash = crypto.createHash('md5').update(pwtext).digest('hex');
  user.setPassword(hash);
}

변경 후

javascript
const bcrypt = require('bcrypt');

function setUserPassword(user, pwtext) {
  const saltRounds = 12; // 예시 비용: 서비스 환경에 맞게 조정
  bcrypt.hash(pwtext, saltRounds, function(err, hash) {
    if (err) throw err;
    user.setPassword(hash);
  });
}

설명:

  • 변경 전: 위 코드는 MD5 알고리즘을 사용하여 비밀번호를 해싱합니다. 계산이 빨라 공격자가 많은 후보를 시험할 수 있고, 예제에는 고유한 솔트도 없습니다.
  • 변경 후: bcrypt가 솔트를 생성하고 계산 비용을 적용하여 후보 시험 비용을 높입니다. 예제의 비용 12를 보편적인 보장으로 보지 말고 환경에 맞게 정하세요. bcrypt의 72바이트 입력 제한을 처리하고, 해싱 실패를 애플리케이션의 오류 처리 경로로 전달하세요.

참조