2

私がやっていることは、新規顧客を挿入するときに PHP でデータを暗号化することです。ただし、後で SQL Server コマンドを使用してテーブル全体を復号化する必要があります。ただし、DecryptByKey がVarbinary. Varbinaryただし、PHP で暗号化すると、変数は生成されません。2 つの暗号化アルゴリズムは同じでなければなりません。

私は何を間違っていますか?

暗号化に使用する PHP:

function fnE($sV, $sS)
{
    return trim(
        base64_encode(
            mcrypt_encrypt(
                MCRYPT_RIJNDAEL_256,
                $sS, $sV,
                MCRYPT_MODE_ECB,
                mcrypt_create_iv(
                    mcrypt_get_iv_size(
                        MCRYPT_RIJNDAEL_256,
                        MCRYPT_MODE_ECB
                    ),
                MCRYPT_RAND)
            )
        )
    );
}

これにより、"James" が "/mucJj8Znec7aygh3ly2DI45bSxyv6vG4dzFz4SVVHk=" に変換され、列名 'first_name' の 'customer_details' というテーブルに挿入されます。

次に、SQL Server で、PHP で使用したものと同じパスワードでマスター キーを作成します。

それから私は:

Create Symmetric Key AdvSym
With Algorithm =AES_256
Encryption by Certificate AdvCert
GO

しかし、復号化しようとすると常にNULLが表示されます:

Select first_name,
Convert(Varchar(100), DecryptByKey(first_name)) as DecryptedName from customer_details
go

編集:SQLのみを使用する場合、暗号化と復号化に成功していることを知っておく必要があります。ただし、PHP を使用して暗号化し、SQL を使用して復号化できるようにする必要があります。

4

1 に答える 1

0

SQLとアプリケーション内で同じ資格情報を使用していますか?

SQL のドキュメントでは、許可されていないデータベース ユーザーが値を復号化しようとすると、正しいキー名と使用されている場合はソルトを使用している場合でも、データベース ユーザーがそのキーに対して false のビュー定義を持っている場合、結果は null を返すと記載されています。

私が使用した回避策は、アプリケーション ユーザーにキーに対するアクセス許可を与えたくない場合、ユーザー定義の複数ステートメント テーブル関数内に選択を記述し、その内部で 'with execute as [ を使用して変更することです。 allowedUserhere].'

これを機能させるには、アプリケーション ユーザーが「キー ユーザー」に「なりすます」ことを忘れないでください。

于 2013-10-15T23:26:56.407 に答える