2

我正在做的是在插入新客户时使用 PHP 加密数据。但是稍后我将需要使用 SQL Server 命令解密整个表。但是我遇到了一个问题,我认为 DecryptByKey 只会接受Varbinary. 但是,当我使用 PHP 加密时,它不会产生Varbinary变量。两种加密算法应该相同。

我究竟做错了什么?

我用来加密的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=”,它被插入到名为“customer_details”的表中,列名为“first_name”。

然后在 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 文档指出,当不允许的数据库用户尝试解密一个值时,即使使用正确的密钥名称和 salt(如果使用),如果数据库用户对所述密钥的视图定义为 false,则结果将返回 null。

我使用的一种解决方法是,如果您不希望您的应用程序用户能够对某个键拥有权限,则在用户定义的多语句表函数中编写选择,并在其中更改使用 'with execute as [ allowedUserhere]。

请记住允许您的应用程序用户“模拟”您的“关键用户”以使其正常工作。

于 2013-10-15T23:26:56.407 回答