본문 바로가기
MySql

MySQL sha1 및 salt로 비밀번호 저장

by 베이스 공부 2021. 1. 22.
반응형

나는 간단한 등록 스크립트를 PHP로 작성했고 내가하는 방식이 사용자 암호를 저장할 수있을만큼 안전한지 궁금했습니다. 32 비트 랜덤 솔트를 생성하고이를 sha1 해시 암호에 추가하고 있습니다.

//create new validator object
    $validator = new data_validation();
    //validate user input
    $firstName = $validator->validate_fname($firstName); //is the first name a string?
    $lastName = $validator->validate_lname($lastName); // is the last name a string?
    $username = $validator->validate_username($username); // is the username a string?
    $email = $validator->validate_email($email); //is the email in valid format?

    //make sure there isn't duplicate emails
    $valQuery = $link->query("SELECT email FROM users WHERE email = '" .$email. "'");

    if ($valQuery->num_rows == 1) {
        echo "An email is already registered with that address";
        return false;
    }

    // generate a random salt for converting passwords into sha1
    $salt = $link->real_escape_string(bin2hex(mcrypt_create_iv(32, MCRYPT_DEV_URANDOM)));
    $saltedPW =  $password . $salt;
    $hashedPW = sha1($saltedPW);

    mysqli_connect($db_host, $db_user, $db_pass) OR DIE (mysqli_error());
    // select the db
    mysqli_select_db ($link, $db_name) OR DIE ("Unable to select db".mysqli_error($db_name));

     // our sql query
    $sql = "INSERT INTO users (first_name, last_name, username, email, password, salt) VALUES ('$firstName', '$lastName', '$username', '$email', '$hashedPW', '$salt');";

    //save the updated information to the database          
    $result = mysqli_query($link, $sql) or die("Error in Query: " . mysqli_error($link));

    if (!mysqli_error($link)) 
    {
        $row = mysqli_fetch_assoc($result);
        $_SESSION['user_id'] = $row['user_id'];
        $_SESSION['loggedin'] = TRUE;
        header("Location: ../home");
    }

또한 절차 적 및 oop php의 조합을 사용하고 있습니다. 대부분은 절차 적으로 이루어 지지만 위의 스크립트에서 사용 된 유효성 검사 클래스와 같은 몇 가지 oop 클래스가 있습니다. 두 스타일을 모두 사용하면 성능 문제가 발생합니까?

 

해결 방법

 


가장 중요한 것은:

  • 가능하면 scrypt를 사용하세요. 할 수 없다면 bcrypt.
  • bcrypt 또는 scrypt를 사용할 수없는 경우 PBKDF2를 사용합니다.



[MD5, SHA1, SHA256, SHA512, SHA-3 등]은 모두 다량의 데이터 다이제스트를 가능한 한 짧은 시간에 계산하도록 설계된 범용 해시 함수입니다. 이것은 그들이 데이터의 무결성을 보장하고 암호를 저장하는 데 완전히 쓰레기를 보내는 데 환상적이라는 것을 의미합니다.


 

참조 페이지 https://stackoverflow.com/questions/13115242

 

 

반응형

댓글