복붙노트

코드 보안을 위해 PDO와 암호 해싱을 어떻게 사용합니까? [닫은]

PHP

코드 보안을 위해 PDO와 암호 해싱을 어떻게 사용합니까? [닫은]

내 코드는 실제로 작동하지만 실제로 안전하지는 않습니다. MD5를 사용하지 않으려 고합니다. 안전하지는 않습니다. 나는 암호 해싱을 찾고 있었지만 어떻게 코드에 통합할지는 모르겠다.

로그인:

require_once __DIR__.'/config.php';
session_start();

$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);

$sql = "SELECT * FROM users WHERE username = :u AND password = :p";
$query = $dbh->prepare($sql); // prepare
$params = array(":u" => $_POST['username'], ":p" => $_POST['password']);
$query->execute($params); // execute

$results = $query->fetchAll(); // then fetch


//hash passwords pls

if (count($results) > 0 ){
$firstrow = $results[0];
$_SESSION['username'] = $firstrow['username'];
echo "Hello $username you have successfully logged in";
//header ("location:.php");
}
else{
echo "Login Has Failed";
return;
} 

레지스터:

$dbh = new PDO('mysql:host=' . DB_HOST . ';dbname=' . DB_USERNAME, DB_USERNAME, DB_PASSWORD);

$username = $_POST["username"];
$email = $_POST["email"];
$password = $_POST["password"];

$stmt = $dbh->prepare("insert into users set username='".$username."', email='".$email."', password='".$password."' ");
$stmt->execute();
echo "<p>Thank you, you are registered</p>";

누구든지 내가 가지고있는 코드에 그것을 통합하는 법을 보여줄 수 있습니까?

해결법

  1. ==============================

    1.라이브러리 만 사용하십시오. 진지하게. 그들은 이유가 있기 때문에 존재합니다.

    라이브러리 만 사용하십시오. 진지하게. 그들은 이유가 있기 때문에 존재합니다.

    너 혼자하지 마. 자신의 소금을 만드는 경우, 당신은 틀린 일을하고 있습니다. 이를 처리하는 라이브러리를 사용해야합니다.

    $dbh = new PDO(...);
    
    $username = $_POST["username"];
    $email = $_POST["email"];
    $password = $_POST["password"];
    $hash = password_hash($password, PASSWORD_DEFAULT);
    
    $stmt = $dbh->prepare("insert into users set username=?, email=?, password=?");
    $stmt->execute([$username, $email, $hash]);
    

    로그인시 :

    $sql = "SELECT * FROM users WHERE username = ?";
    $stmt = $dbh->prepare($sql);
    $result = $stmt->execute([$_POST['username']]);
    $users = $result->fetchAll();
    if (isset($users[0]) {
        if (password_verify($_POST['password'], $users[0]->password) {
            // valid login
        } else {
            // invalid password
        }
    } else {
        // invalid username
    }
    
  2. ==============================

    2.코드 보안 강화

    코드 보안 강화

    일반적인 질문에 대해

    의견에 당신이 조언했듯이, PHPass를 사용하거나 이미 API를 만들었습니다.

    계정 생성시 사용자 이름을 해시하고 전달하고 소금을 칠해 해시를 데이터베이스에 삽입합니다.

    인증시에 주어진 login + password 입력과 salt를 생성하기 위해 추가 한 정보로 해시를 다시 생성합니다.

    생성 된 해시가 모두 일치하면 사용자가 인증됩니다.

    편집 : 예 password_hash도 좋습니다.

  3. ==============================

    3.기본적으로 복잡성이 다른 두 가지 옵션이 있습니다.

    기본적으로 복잡성이 다른 두 가지 옵션이 있습니다.

    사용자 레코드를 검색 할 때 제공된 암호에서 계산 된 해시와 DB에 저장된 해시를 비교합니다.

    예:

    $HashedPass = hash('sha512', $password);
    

    또는 미리 정의 된 SALT로

    $HashedPass = hash('sha512', $password.SALT_STRING);
    

    이전에했던 것처럼 이것을 DB에 저장하십시오.

    비슷한 방식으로 인증 :

    $HashedPass = hash('sha512', $password.SALT_STRING);
    

    그런 다음 저장된 해시 비교와 관련된 해시 비교를 기반으로 DB에서 검색 할 수 있습니다.

    이제 해싱 알고리즘에 대한 우려를 해결하고자합니다. 당신은 md5를 사용하지 않아도됩니다. 더 안전한 해싱 알고리즘을 사용할 수 있습니다. 여기에있는 주석을 참고하십시오 : PHP의 해쉬 함수 한 가지 제안은 sha512 알고리즘을 사용하는 것입니다.

    가장 중요한 점은 해시가 일방적 인 변환임을 이해해야합니다. 원래 해시 문자열에서 원래 암호를 리버스 엔지니어링하는 실제 방법이 없으며 동일한 해시 문자열을 생성하는 대체 문자열을 찾는 것뿐입니다.

    Hash DB의 도난 피해를 줄이기 위해 Salt와 함께 강력한 Hash 알고리즘을 사용하여 사용자의 요구에 충분히 만족 시키길 바랍니다.

  4. from https://stackoverflow.com/questions/29777684/how-do-i-use-password-hashing-with-pdo-to-make-my-code-more-secure by cc-by-sa and MIT license