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