所以我尝试使用我创建的User类创建一个带有盐的Blowfish加密密码,这反过来又扩展了一个整体数据库对象,该对象使用Late Static Bindings从我的数据库到CRUD。无论如何,在尝试调用create()方法并将其插入到我的数据库之前,我正试图加密密码,但每当我将信息放入表单时,它会变为空白的'update.php 'screen(update.php有我所有表格的所有isset($ _ POST [])调用)并且没有任何内容被上传到我的数据库。这是迄今为止的代码......
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");
}
}
<?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相对较新,所以任何帮助都会非常感激。如果您可以简要介绍一下如何修复问题,那也很棒。谢谢!
答案 0 :(得分:1)
您的代码有三个问题:
您无法从静态方法引用常规方法。为了使您的代码有效,您还必须使用generate_salt
方法static
。
在连接格式和salt时,使用错误的格式变量($hash_format
应为$hashed_format
)。
您的格式错误。看看documentation。河豚格式是:
$[algo]$[difficulty]$[salt]$
您的格式为:
[algo]$[difficulty]$[salt]
所以,将你的方法改为:
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]);
}