현재 위치: > 최신 기사 목록> MD5로 비밀번호를 저장하는 것이 안전합니까? PHP MD5 기능의 비밀번호 저장에서 일반적인 오해에 대해 이야기하십시오.

MD5로 비밀번호를 저장하는 것이 안전합니까? PHP MD5 기능의 비밀번호 저장에서 일반적인 오해에 대해 이야기하십시오.

gitbox 2025-06-18

웹 개발에서 보안 사용자 비밀번호의 저장은 기본적이고 중요한 작업입니다. 그러나 보안 지식의 인기가 높아짐에도 불구하고 많은 개발자들은 MD5 () 기능을 습관적으로 사용하여 초보자가 될 때 또는 간단한 시스템을 구축 할 때 사용자 비밀번호를 암호화하고 저장합니다. 오늘 우리는 MD5를 사용하여 비밀번호를 저장하는지 여부 와이 관행의 일반적인 오해에 대해 이야기 할 것입니다.

1. PHP의 MD5 함수는 무엇입니까?

MD5 () 는 PHP에 내장 된 해시 함수로, 모든 길이의 문자열을 32 자 66 진수 문자열로 변환 할 수 있습니다. 예를 들어:

 <span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-title function_ invoke__">md5</span></span><span>(</span><span><span class="hljs-string">'password123'</span></span><span>); </span><span><span class="hljs-comment">// 산출:482c811da5d5b4bc6d497ffa98491e38</span></span><span>
</span></span>

이것은 돌이킬 수없는 해싱 프로세스입니다 (이론적으로). 많은 초기 개발자들은이를 사용하여 사용자 비밀번호를 스토리지에 "암호화"하는 데 사용하여 사용자의 개인 정보를 보호 할 것이라고 믿었습니다.

2. MD5는 비밀번호를 저장하는 데 사용하는 것이 안전합니까?

답은 안전하지 않으며 오래 전에 제거되었습니다.

주된 이유는 다음과 같습니다.

1. 계산 속도가 너무 빠르고 쉽게 무차별대로

MD5 ()는 원래 데이터 무결성을 검증하는 데 사용되는 해시 함수로 의도되며 계산 속도는 매우 빠릅니다. 그러나 속도로 인해 무차별 인력 공격이나 무지개 테이블 공격에 사용하기가 매우 쉽습니다.

공격자는 매우 짧은 시간 안에 많은 조합을 시도하여 원래 암호를 추측 할 수 있습니다. 특히 비밀번호 또는 약한 암호에 대한 저항이 거의 없습니다.

2. 소금이 추가되지 않았습니다

MD5 () 는 결정 론적 기능입니다. 동일한 입력은 항상 동일한 출력을 생성합니다. 그 결과 두 사용자의 암호가 동일하면 생성 된 해시 값이 동일하며 공격자는 한 번만 크랙하면 여러 계정에 적용될 수 있습니다.

소금이없는 해시 저장 방법은 레인보우 테이블로 분해하기가 매우 쉽습니다.

3. 그것은 널리 갈라졌다

인터넷에는 MD5 해시 및 일반 텍스트 암호에 대한 많은 매핑 데이터베이스가 있습니다. 예를 들어 MD5 ( '123456') 에서 얻은 해시 값 만 검색 엔진에 붙여 넣으면 즉시 원래 비밀번호를 찾을 수 있습니다.

3. 어떻게해야합니까? 더 안전한 접근법은 무엇입니까?

password_hash ()password_verify () 사용

PHP는 Password_hash ()Password_Verify () 기능을 제공합니다. 버전 5.5에서 시작하여 현재 암호 암호화 및 확인에 권장되는 방법입니다.

샘플 코드는 다음과 같습니다.

 <span><span><span class="hljs-comment">// 암호 해시를 생성하십시오</span></span><span>
</span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-string">'password123'</span></span><span>, PASSWORD_DEFAULT);

</span><span><span class="hljs-comment">// 비밀번호를 확인하십시오</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_verify</span></span><span>(</span><span><span class="hljs-string">'password123'</span></span><span>, </span><span><span class="hljs-variable">$hash</span></span><span>)) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'올바른 비밀번호'</span></span><span>;
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">'오류 비밀번호'</span></span><span>;
}
</span></span>

password_hash ()는 기본적으로 bcrypt 알고리즘을 사용하고 무작위 소금 값을 자동으로 생성합니다. 그것은 무차별 인력 크래킹과 무지개 테이블 공격과 싸우는 메커니즘이 내장되어 있습니다.

왜 그것을 추천합니까?

  • 자동 소금 첨가

  • 구성 가능한 계산 강도 (비용 요인)

  • 확장 가능 (Argon2와 같은 다른 알고리즘 지원)

  • 공식 유지 보수는 최신 암호 저장 표준을 준수합니다

4. 요약

MD5 ()를 사용하여 암호를 저장하는 것은 구식이며 위험하며 초기 프로젝트에서는 더 일반적이지만 오늘날에는 더 이상 안전하지 않습니다. 사이버 공격 방법이 계속 업그레이드됨에 따라 개발자는 이전 보안 개념을 포기하고보다 현대적이고 안전한 방법을 사용하여 사용자 암호를 처리해야합니다.

기억하십시오 : 보안은 "암호화"에 의존하는 것이 아니라 디자인에 의존합니다.
Password_hash ()를 수용하고 md5 ()를 거부하는 것이 사용자 안전에 대한 가장 기본적인 존중입니다.