최근에 나는 인터넷에서 우연히 발견한 로그인 스크립트에 나만의 보안을 구현하려고 노력하고 있습니다. 각 사용자를 위한 솔트를 생성하는 스크립트를 직접 만드는 방법을 배우려고 애쓰다가 우연히 password_hash
를 발견했습니다.
내가 이해한 바에 따르면(이 페이지를 읽은 것에 근거하여) password_hash
를 사용하면 라인에 이미 소금이 생성됩니다. 이게 진짜야?
또 다른 질문은, 소금을 2가지 종류로 갖는 것이 현명하지 않을까요? 하나는 파일에 직접 있고 다른 하나는 데이터베이스에 있습니까? 이렇게 하면 누군가 데이터베이스의 솔트를 손상시킨 경우에도 솔트를 파일에 직접 저장할 수 있습니까? 나는 여기서 소금을 저장하는 것이 결코 현명한 생각이 아니라는 것을 읽었습니다. 그러나 사람들이 그것이 무엇을 의미하는지 항상 혼란스럽습니다.
예, 올바르게 이해하셨습니다. 함수password_hash()는 자체적으로 솔트를 생성하고 생성된 해시 값에 포함합니다. 솔트가 제 역할을 하는 것으로 알려져 있더라도 데이터베이스에 솔트를 저장하는 것은 절대적으로 옳습니다.
으아악당신이 언급한 두 번째 소금(파일에 저장된 것)은 실제로는 Pepper 또는 서버 측 키입니다. 해싱하기 전에 소금처럼 추가하면 후추를 추가하는 것입니다. 하지만 더 좋은 방법이 있습니다. 먼저 해시를 계산한 다음 서버측 키를 사용하여 해시를 암호화(양방향)하는 것입니다. 이를 통해 필요한 경우 키를 변경할 수 있습니다.
솔트와는 달리 이 키는 비밀로 유지되어야 합니다. 사람들은 종종 그것을 혼동하고 소금을 숨기려고 노력하지만 소금이 제 역할을 하도록 두고 열쇠로 비밀을 추가하는 것이 더 좋습니다.
비밀번호를 저장하려면
password_hash
를 사용하는 것이 좋습니다. 데이터베이스와 파일로 분리하지 마세요.다음과 같은 입력이 있다고 가정합니다:
으아아아먼저 다음을 수행하여 비밀번호를 해시합니다.
으아아아그런 다음 출력을 봅니다.
으아아아보시다시피 해시되어 있습니다. (나는 당신이 이 단계를 따랐다고 가정합니다).
이제 이 해시된 비밀번호를 데이터베이스에 저장했으므로 비밀번호 열이 해시 값(최소 60자 이상)을 수용할 만큼 충분히 큰지 확인하세요 . 사용자가 로그인을 요청하면 다음과 같이 데이터베이스의 해시를 사용하여 입력한 비밀번호를 확인할 수 있습니다.
으아아아공식 참고자료