password_needs_rehash 함수는 새로운 알고리즘 또는 암호화 매개 변수를 사용하여 기존 암호의 해시 값을 업데이트 해야하는지 확인하는 데 사용됩니다. 현재 암호의 해시를 지정된 암호화 매개 변수 (예 : 알고리즘, 비용 요인 등)와 비교합니다. 기존 비밀번호 해시가 새로운 요구 사항을 충족하지 않으면 true가 반환됩니다. 그렇지 않으면 False가 반환됩니다.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span>(</span><span><span class="hljs-variable">$hashedPassword</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</span></span><span>])) {
</span><span><span class="hljs-variable">$newHash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">12</span></span><span>]);
</span><span><span class="hljs-comment">// 데이터베이스에서 비밀번호를 업데이트합니다</span></span><span>
}
</span></span>이 예에서 Password_Needs_RHASH는 $ HASHEDPASSWORD가 지정된 암호화 매개 변수 (예 : 비용 매개 변수)를 충족하는지 여부를 확인합니다. 충족하지 않으면 비밀번호를 다시 암호화해야합니다.
비밀번호 해싱 알고리즘의 지속적인 업데이트 및 업그레이드를 통해 이전 알고리즘으로 암호화 된 암호는 보안 위험에 직면 할 수 있습니다. 예를 들어, PHP는 처음에 MD5 및 SHA-1과 같은 알고리즘을 사용하여 암호화되었지만 이러한 알고리즘은 취약한 것으로 입증되었습니다. BCrypt 및 Argon2와 같은 최신 암호화 알고리즘의 출현으로 이러한 알고리즘을 사용하여 암호화 된 암호가 더 안전합니다.
Password_needs_Rheash 함수를 도입하면 개발자가 비밀번호를 저장할 때 비밀번호를 유연하게 업데이트 할 수 있습니다. 예를 들어, BCrypt를 Argon2로 바꾸기로 결정하면 원래 BCrypt로 암호화 된 비밀번호를 감지하여 Password_needs_Rhehash를 통해 새로운 암호화 메소드로 업데이트 할 수 있습니다. 이러한 방식으로 데이터베이스에 저장된 암호조차도 다음에 사용자가 로그인 할 때 새 암호화 알고리즘으로 자동 마이그레이션 할 수 있습니다.
암호화 알고리즘 자체의 보안은 알고리즘 자체뿐만 아니라 알고리즘의 매개 변수 설정 (예 : BCRYPT의 비용 매개 변수)과 관련이 있습니다. 비용 매개 변수는 해시 계산의 시간 복잡성을 결정합니다. 값이 높을수록 보안이 높을 수 있지만 계산 시간이 길어질 수도 있습니다.
비밀번호를 저장하기 위해 10 번의 비용 으로 BCrypt 알고리즘을 처음 사용했지만 시간이 지남에 따라 서버의 처리 능력이 강하고 더 높은 비용 값을 사용하여 보안을 향상시킬 수 있다고 가정합니다. password_needs_rehash를 사용하면 데이터베이스에 저장된 이전 비밀번호가 저렴한 비용을 사용하고 필요에 따라 업데이트 할 수 있습니다.
<span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">password_needs_rehash</span></span><span>(</span><span><span class="hljs-variable">$hashedPassword</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">14</span></span><span>])) {
</span><span><span class="hljs-variable">$newHash</span></span><span> = </span><span><span class="hljs-title function_ invoke__">password_hash</span></span><span>(</span><span><span class="hljs-variable">$password</span></span><span>, PASSWORD_BCRYPT, [</span><span><span class="hljs-string">'cost'</span></span><span> => </span><span><span class="hljs-number">14</span></span><span>]);
</span><span><span class="hljs-comment">// 데이터베이스에서 비밀번호를 업데이트합니다</span></span><span>
}
</span></span>이 예에서는 원래 해시의 비용이 14 미만인 경우 재 암호화가 필요합니다.
password_needs_rehash는 해시를 업데이트 해야하는지 쉽게 감지 할 수있는 방법을 제공하지만이 프로세스는 여전히 성능에 약간의 영향을 줄 수 있습니다. 특히 대규모 사용자 또는 자주 데이터베이스 액세스가 있으면 사용자 로그인 할 때마다 해시를 확인하면 서버의 부담이 증가 할 수 있습니다.
성능 영향을 줄이려면 비밀번호 로그인이 성공할 때 배경에서 비동기로 암호를 다시 암호화하는 것이 좋습니다. 즉, 암호 재 암호화는 사용자의 즉각적인 경험에 영향을 미치지 않고 배경의 데이터베이스의 비밀번호 해시를 점차 업데이트합니다.
비밀번호의 해시가 현재 보안 표준을 충족하는지 정기적으로 확인함으로써 Password_needs_Rheash를 사용하면 시스템의 보안이 크게 향상 될 수 있습니다. 업데이트가 없으면 다음 위험이 발생할 수 있습니다.
이전 알고리즘과 관련된 보안 문제 : MD5 및 SHA1과 같은 이전 암호화 알고리즘은 더 이상 안전하지 않으며 공격자는 무지개 테이블이나 다른 방법을 통해 이러한 암호를 쉽게 갈라질 수 있습니다.
부적절한 매개 변수 설정 : 비용이 너무 낮은 경우 비밀번호가 무차별 적 공격에 취약 할 수 있습니다. 공격자는 많은 가능한 암호 조합을 실험하여 해시를 깨뜨립니다.
비밀번호 해시를 정기적으로 감지하고 업데이트하면 암호 스토리지가 항상 최신 보안 관행을 준수하도록 도와줍니다.