尝试为使用 PHP/MySQL 的客户端开发 AES 加密数据库。插入加密值有效,但无法返回可用的解密值。
public static function auth($username="", $password="") {
global $database;
$fields = self::$db_fields;
array_shift($fields);
$username = $database->escape_value($username);
$password = $database->escape_value($password);
$hashed_pwd = sha1($password);
$join_str = ", '" . AUTH_KEY . "'), AES_DECRYPT(";
$sql = "SELECT id, AES_DECRYPT(";
$sql .= join($join_str, $fields) . ", '" . AUTH_KEY . "') FROM " . self::$table_name. " ";
$sql .= "WHERE u_name = AES_ENCRYPT('{$username}', '" . AUTH_KEY . "') ";
$sql .= "AND u_pwd = AES_ENCRYPT('{$hashed_pwd}', '" . AUTH_KEY . "') ";
$sql .= "LIMIT 1";
使用以下查询:
$query_result = $database->query($sql);
$result_array = $database->fetch_array($query_result);
}
回报:
Array (
[0] => 5
[id] => 5
[1] => a_user_name
[AES_DECRYPT(user_name, '[PRINTS FULL AUTH KEY]')] => a_user_name
[2] => 0000hashedpasswordstring00000
[AES_DECRYPT(user_pwd, '[PRINTS FULL AUTH KEY]')] => 0000hashedpasswordstring00000
[3] => sample@email.com
[AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => sample@email.com
)
这是次要解决方案。理想情况下,查询将是面向对象的,但这种方法返回一个包含字段但没有值的数组。
显然,在结果中传输完整的身份验证密钥完全违背了加密的目的。困惑为什么它返回一个组合的关联/索引数组,而不仅仅是一个索引数组,或者只是一个关联数组。SQL 语法中是否有会返回[user_email] => sample@email.com
而不是 的
更改[AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => sample@email.com
?