使用PHP加密并使用SQL Server解密

时间:2012-07-16 14:15:31

标签: php sql-server database encryption

我正在做的是在插入新客户时使用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 =”,它被插入名为'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

编辑:应该知道我在使用ONLY SQL时成功加密和解密。但是,我需要能够使用PHP进行加密,然后使用SQL进行解密。

1 个答案:

答案 0 :(得分:0)

在sql和应用程序中使用相同的凭据。

SQL文档指出,当不允许的数据库用户尝试解密某个值时,即使使用了正确的密钥名称和salt(如果使用的话),如果数据库用户的视图定义为false,则结果将返回null。

我使用过的解决方法,如果你不希望应用程序用户能够拥有对某个键的权限,那就是在用户定义的多语句表函数中写入select并在其中更改使用'with执行[allowedUserhere]。'

请务必让您的应用程序用户“模仿”您的“关键用户”,以使其正常工作。