在PHP类中创建了哈希密码

时间:2014-06-07 20:24:55

标签: php oop hashcode password-encryption

所以我尝试使用我创建的User类创建一个带有盐的Blowfish加密密码,这反过来又扩展了一个整体数据库对象,该对象使用Late Static Bindings从我的数据库到CRUD。无论如何,在尝试调用create()方法并将其插入到我的数据库之前,我正试图加密密码,但每当我将信息放入表单时,它会变为空白的'update.php 'screen(update.php有我所有表格的所有isset($ _ POST [])调用)并且没有任何内容被上传到我的数据库。这是迄今为止的代码......

update.php中的代码

if (isset($_POST["createAdmin"])) {

    $user = new Users();
    $user->password = $user->password_encrypt($_POST['new_password']);
    $user->username = $_POST['new_username'];
    $user->first_name = $_POST['first_name'];
    $user->last_name = $_POST['last_name'];
    if($user->create()) {
        $_SESSION['new_admin_message'] = $user->password;
        redirect_to("../public/admin/manage_admin.php");
    }
    else {
        $_SESSION['new_admin_message'] ="Admin didn't create successfully";
        redirect_to("../public/admin/manage_admin.php");
    }
}

user.php中的代码(用户类)

<?php
require_once(LIB_PATH.DS.'database.php');

class Users extends DatabaseObject {


    protected static $table_name="users";
    protected static $db_fields = array('id', 'username', 'password', 'first_name', 'last_name');
    public $id;
    public $username;
    public $password;
    public $first_name;
    public $last_name;

public static function password_encrypt($password) {
    $hashed_format = "2y$10$"; // Tels PHP to use Blowfish with a "cost" of 10
    $salt_length = 22; // Blowfish salts should be 22-characters or more
    $salt = generate_salt($salt_length);
    $format_and_salt = $hash_format . $salt; 
    $hash = crypt($password, $format_and_salt);
    return $hash;
}

private function generate_salt($length) {
    // Not 100% unique, not 100% random, but good enoguh for a salt 
    // MD5 returns 32 characters
    $unique_random_string = md5(uniqid(mt_rand(), true));

    // Valid caracters for a solt are [a-zA-Z0-9./]
    $base64_string = base64_encode($unique_random_string);

    // But not '+' which is valid in base64 encoding
    $modified_base64_string = str_replace('+', ".", $base64_string);

    //Truncate string to the correct length
    $salt = substr($modified_base64_string, 0, $length);

    return $salt;
}

在课堂上还有一些其他方法对这个特定问题并不重要。我对OOP和PHP相对较新,所以任何帮助都会非常感激。如果您可以简要介绍一下如何修复问题,那也很棒。谢谢!

1 个答案:

答案 0 :(得分:1)

您的代码有三个问题:

  1. 您无法从静态方法引用常规方法。为了使您的代码有效,您还必须使用generate_salt方法static

  2. 在连接格式和salt时,使用错误的格式变量($hash_format应为$hashed_format)。

  3. 您的格式错误。看看documentation。河豚格式是:

    $[algo]$[difficulty]$[salt]$
    

    您的格式为:

    [algo]$[difficulty]$[salt]
    
  4. 所以,将你的方法改为:

    public static function password_encrypt($password) {
        $format = '$2y$10$'.$this->generate_salt(22).'$';
        return crypt($password, $format);
    }
    

    另一件事,不是技术上的错误&#34;但这不是一件好事,是你的盐法。您应该从加密更强的源生成盐,例如使用mcrypt扩展名,或者,如果您使用* nix,甚至从/ urandom或/ random中获取它。创建&#34;随机&#34;通过调用函数的混合字符串,最后得到看起来足够随机的字符串,这不是一个好主意。

    您可以做的最好的事情是使用PHP附带的password library。它将为您处理所有密码哈希,并将保护您自己。如果你有PHP <5.5.0,那么你应该使用compatibility library

    换句话说,您应该将代码更改为:

    public static function password_encrypt($password) {
        return password_hash($password, PASSWORD_BCRYPT, ['cost' => 10]);
    }