현재 위치: > 최신 기사 목록> Hash_PBKDF2 기능을 사용하여 키를 생성 한 후 보안 스토리지를 보장하는 방법은 무엇입니까?

Hash_PBKDF2 기능을 사용하여 키를 생성 한 후 보안 스토리지를 보장하는 방법은 무엇입니까?

gitbox 2025-07-02

1. HASH_PBKDF2 기능을 이해하십시오

HASH_PBKDF2는 PHP가 암호 기반 해시 함수 (PBKDF2)를 사용하여 키를 생성하기 위해 제공하는 함수입니다. PBKDF2는 다수의 해싱 및 소금 기술을 통해 보안을 향상시키는 알고리즘으로, 무차별 인력 크래킹 및 사전 공격을 효과적으로 방지 할 수 있습니다.

 <span><span><span class="hljs-variable">$hash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-variable">$length</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>);
</span></span>

매개 변수 분석 :

  • "SHA256" : 여기에서 SHA-256을 사용하여 선택한 해싱 알고리즘.

  • $ 비밀번호 : 사용자가 입력 한 비밀번호.

  • $ 소금 : 암호화 보안을 증가시키기 위해 무작위로 생성 된 소금 값.

  • $ 반복 : 해시 반복 수. 반복의 수가 높을수록 갈라지기가 더 어렵습니다.

  • $ 길이 : 생성 된 키의 길이.

  • False : 이진 결과를 출력할지 여부는 일반적으로 False 로 설정되며 16 진수 문자열을 출력합니다.

PBKDF2의 보안은 소금 값과 반복 수에 따라 다릅니다. 이러한 매개 변수를 합리적으로 설정하면 키 스토리지의 보안이 크게 향상 될 수 있습니다.


2. 생성 된 키를 안전하게 저장하십시오

2.1 안전을 향상시키기 위해 소금과 여러 반복을 사용하십시오

키를 생성 할 때는 먼저 무작위로 생성 된 소금 값 ( $ 소금 )을 사용해야합니다. 소금 값의 기능은 동일한 비밀번호를 동일한 키를 생성하여 무차별 대입의 어려움을 더욱 증가시키는 것입니다. 소금 값의 길이는 일반적으로 무작위성을 보장하기 위해 최소 16 바이트 인 것이 좋습니다.

Hash_pbkdf2 에서 충분한 반복을 설정하는 것이 중요합니다. 이론적으로 반복이 많을수록 반복이 길수록 키를 생성하는 데 더 오래 걸리고 갈라지기가 더 어려워집니다. 권장 숫자 반복은 10 만 회 이상입니다. 이런 식으로 공격자는 키를 무차별하기 위해 더 많은 시간과 컴퓨팅 리소스가 필요합니다.

 <span><span><span class="hljs-variable">$salt</span></span><span> = </span><span><span class="hljs-title function_ invoke__">bin2hex</span></span><span>(</span><span><span class="hljs-title function_ invoke__">random_bytes</span></span><span>(</span><span><span class="hljs-number">16</span></span><span>)); </span><span><span class="hljs-comment">// 생성하다16바이트의 임의의 소금 값</span></span><span>
</span><span><span class="hljs-variable">$iterations</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// 적어도100,000이 반복</span></span><span>
</span><span><span class="hljs-variable">$key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">hash_pbkdf2</span></span><span>(</span><span><span class="hljs-string">"sha256"</span></span><span>, </span><span><span class="hljs-variable">$password</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>, </span><span><span class="hljs-variable">$iterations</span></span><span>, </span><span><span class="hljs-number">64</span></span><span>, </span><span><span class="hljs-literal">false</span></span><span>); </span><span><span class="hljs-comment">// 64바이트 키</span></span><span>
</span></span>

2.2 원래 비밀번호가 저장되지 않습니다

사용자의 원래 비밀번호를 직접 저장하는 것은 매우 안전하지 않습니다. PHP에서 키의 해시 값은 원래 비밀번호 문자열이 아니라 항상 저장되어야합니다. HASH_PBKDF2 에 의해 생성 된 키는 여러 번 암호화되고 처리되었으며 이론적으로 원래 비밀번호를 복구 할 수 없습니다.

예를 들어, 생성 된 키 값은 데이터베이스에 저장하고 사용자의 다른 정보로 저장할 수 있습니다.

 <span><span><span class="hljs-comment">// 키 해시 및 소금 값을 데이터베이스에 저장하십시오</span></span><span>
</span><span><span class="hljs-variable">$stmt</span></span><span> = </span><span><span class="hljs-variable">$pdo</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">prepare</span></span><span>(</span><span><span class="hljs-string">"INSERT INTO users (username, password_hash, salt) VALUES (?, ?, ?)"</span></span><span>);
</span><span><span class="hljs-variable">$stmt</span></span><span>-&gt;</span><span><span class="hljs-title function_ invoke__">execute</span></span><span>([</span><span><span class="hljs-variable">$username</span></span><span>, </span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-variable">$salt</span></span><span>]);
</span></span>

2.3 독립적 인 암호화 스토리지 사용

키의 보안을 더욱 향상시키기 위해 더 강한 암호화 알고리즘을 고려하여 저장된 키를 암호화 할 수 있습니다. 예를 들어, 생성 된 키는 AES와 같은 대칭 암호화 알고리즘을 사용하여 암호화 및 저장 될 수 있습니다. 이 경우 주요 저장소는 PBKDF2에 의해 생성 된 해시뿐만 아니라 추가 암호화 계층에도 의존합니다.

 <span><span><span class="hljs-variable">$encryption_key</span></span><span> = </span><span><span class="hljs-string">'your-secure-encryption-key'</span></span><span>;
</span><span><span class="hljs-variable">$encrypted_key</span></span><span> = </span><span><span class="hljs-title function_ invoke__">openssl_encrypt</span></span><span>(</span><span><span class="hljs-variable">$key</span></span><span>, </span><span><span class="hljs-string">'AES-256-CBC'</span></span><span>, </span><span><span class="hljs-variable">$encryption_key</span></span><span>, </span><span><span class="hljs-number">0</span></span><span>, </span><span><span class="hljs-variable">$iv</span></span><span>);
</span></span>

키를 암호화 할 때는 암호화 키 ( $ Encryption_key )의 보안 저장을 보장해야합니다. 암호화 키 자체는 하드웨어 보안 모듈 (HSM) 또는 키 관리 서비스와 같은 매우 안전한 장소에 저장해야합니다.


3. 비밀번호 누출 방지

3.1 데이터베이스 보안

키 자체를 보호하는 것 외에도 전체 데이터베이스의 보안도 중요합니다. 데이터베이스 액세스가 엄격하게 제어되고 SSL/TLS와 같은 강력한 비밀번호 및 암호화 된 연결을 사용하여 Man-In-the-Middle 공격 및 데이터 유출을 방지하십시오.

데이터베이스는 최소 권한의 원칙을 채택해야하며 승인 된 사용자 만 민감한 데이터에 액세스 할 수 있습니다.

3.2 정기적으로 키 및 소금 값을 업데이트합니다

장기 보안을 향상시키기 위해 키와 소금 값에 대한 정기적 인 업데이트도 효과적인 보안 조치입니다. 키를 업데이트하는 것은 간단하지는 않지만 소금 값을 주기적으로 다시 해시 할 수 있고 소금 값을 교체 할 수 있다면 누출 위험을 방지 할 수 있습니다.

예를 들어, 사용자가 로그인 한 후 사용자는 비밀번호를 정기적으로 변경하고 새로운 소금 값과 키로 스토리지를 다시 밀어 넣을 수 있습니다.

3.3 SQL 주입 및 무차별 공격 방지

SQL 주입 공격 방지는 키를 안전하게 저장하는 기본 단계입니다. 데이터베이스 쿼리의 사용자 입력이 완전히 피해야하거나 SQL 주입 취약점을 피하기 위해 전처리 문을 사용하십시오.

Brute-Force Cracking Attack의 경우 로그인 시도 수를 제한하고, 검증 코드 메커니즘을 도입하고, 의심스러운 로그인 동작을 모니터링하여 위험을 줄일 수 있습니다.