2012-07-16 167 views
2

我在做什麼是在插入新客戶時用PHP加密數據。不過後來我需要使用SQL Server命令解密整個表。然而,我遇到了一個問題,我認爲DecryptByKey只會接受Varbinary。但是,當我使用PHP進行加密時,它不會生成Varbinary變量。兩種加密算法應該是相同的。用PHP加密並用SQL Server解密

我在做什麼錯?

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) 
      ) 
     ) 
    ); 
} 

這接通 「詹姆斯」 到 「/ 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進行解密。

+0

嘿,這可能不適合你,但你有沒有考慮過使用Web服務器和數據庫服務器之間的加密連接?您可以強制對SQL連接進行加密。然後,只需傳遞名字純文本,並讓數據庫同時執行這兩個操作。 – cocogorilla 2013-07-25 19:37:55

回答

0

你在SQL和應用程序中使用相同的憑據。

SQL文檔指出,當不允許的數據庫用戶嘗試解密值時,即使使用正確的鍵名和salt(如果使用),如果數據庫用戶對所述鍵的視圖定義爲false,結果將返回null。

如果您不希望應用程序用戶能夠擁有對某個鍵的權限,則使用的解決方法是在用戶定義的多個語句表函數中編寫select,並在其中更改使用'與執行[允許用戶]。'

請記住允許您的應用程序用戶「模擬」您的「關鍵用戶」以使其工作。