데이터베이스에 저장된 사용자 별 소금을 사용하여 사용자 로그인을 구현하기로 결정했습니다. salt는 SHA로 해시되고 데이터베이스에 저장되는 암호의 접두어입니다.단일 쿼리와 사용자 별 암호로 사용자 로그인
이전에는 소금을 사용하지 않았지만 사용자가 입력 한 사용자 이름과 암호를 사용하여 쿼리에서 반환 된 행 수를 계산하는 일반적인 방법을 사용했습니다. 그러나 사용자 당 소금을 사용하면 저장된 암호 해시와 비교하기 전에 소금을 가져와야합니다.
두 개의 쿼리 (소금을 얻기 위해 1 회, 입력 자격 증명의 유효성을 검사하기 위해)를 피하기 위해 입력 된 사용자 이름을 기반으로 한 단일 쿼리에서 소금과 해쉬 된 암호를 가져 오기로 결정했습니다.
SELECT users.salt, users.password
FROM users
WHERE username = ?'
와 같은 뭔가가 다음 서버 측 코드 (PHP)에서 내가 입력 된 암호를 사용하여 소금을 연결, 그것을 해시 이미 데이터베이스에서 가져온 암호를 비교합니다.
명확하지 않은 경우, 키 차이점은 데이터베이스에서이 작업을 수행하기 전에 후자의 방법으로 PHP wheras에서 자격 증명을 확인한다는 것입니다.
용어 보안에, 거기에이 방법의 단점 또는 다른
SQL 삽입을 방지하기 위해 사용자 입력을 적절히 이스케이프하는 것을 기억하십시오. 내 대답에 명시된 바와 같이 -이 PHP와 DBMS 사이의 비밀 번호를 보냅니다; DBMS가 PHP 코드와 동일한 시스템에 있지 않으면 암호가 스누핑에 노출 될 수 있습니다. 또한 PHP 대신 SHA 계산을 사용하여 DBMS를로드합니다. 그 문제가 PHP와 DBMS의 상대적인 작업량에 달려 있는지 여부. –
MySQL 서버와 PHP 간의 데이터 흐름을 고려했습니다. 나는 데이터베이스에 대한 연결의 "보안"을 신뢰할 수 없다면 더 큰 문제가 있다고 생각하는 것이 맞습니까? – gahooa
고맙습니다. 매우 우아합니다. – zenna