1

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 
    )

これは二次的な解決策でした。クエリはオブジェクト指向であることが理想的ですが、そのアプローチはフィールドを含むが値を含まない配列を返すことでした。

明らかに、結果で完全な認証キーを転送すると、暗号化の目的が完全に無効になります。インデックス付き配列や連想配列だけでなく、結合されたアソシエイト/インデックス付き配列を返す理由について混乱しています。[user_email] => sample@email.com の代わりに 返される SQL 構文に変更はあります[AES_DECRYPT(user_email, '[PRINTS FULL AUTH KEY]')] => sample@email.comか?

4

1 に答える 1

1

関数を含む列のエイリアスを使用する必要があります。

$sql  = "SELECT id, AES_DECRYPT(";
$sql .=  join($join_str, $fields) . ", '" . AUTH_KEY . "') AS user_email 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";

SELECTに関するMySQLドキュメントから:

select_exprには、ASalias_nameを使用してエイリアスを指定できます。エイリアスは式の列名として使用され、GROUP BY、ORDER BY、またはHAVING句で使用できます。例えば:

SELECT CONCAT(last_name、'、'、first_name)AS full_name FROM mytable ORDER BY full_name;

このような暗号化は通常、MySQLではなくアプリケーションで行われます。MySQLで実行すると、秘密鍵はMySQLログに記録されます。

于 2012-07-10T17:58:22.857 に答える