2017-07-10 50 views
1

我正在研究如何加密Web服務器上選定的用戶數據字段,並希望有關如何實現最佳結果的建議。舉一個例子,說一個用戶輸入他/她名字電子郵件社會安全號碼;並且:加密數據在SQL Server或C#

  1. 管理員需要能夠查看此信息。在服務器上
  2. 進程需要使用這些信息

...但如果數據庫(或備份)被盜,則信息被加密和無用的。

我想一種方法是生成一個私鑰+公鑰,將其存儲到Windows證書存儲中,將其標記爲「不可導出」(保留當然備份),然後在應用層中將其用於根據需要加密/解密字段。

我爲此使用SQL Server 2016和.NET 4.6,但也有其他依賴項,例如我想支持的Reporting Services。 - 也許是「SQL Server 2016 Always Encrypted」要走的路嗎?你有什麼實際經驗可以分享使用它嗎?

我想如果入侵者獲得服務器的管理控制權(Windows 2016 IIS + SQL Server組合),那麼沒有太多可以完成的事情。或者是?

編輯:我決定去與始終處於加密內置到SQL Server 2016這是我最後生成的主密鑰,我則在本地計算機證書存儲區安裝,然後設置爲一列主鍵入SQL Server(使用簡單的SSMS右鍵單擊DB> Security> Always Encrypted Keys> Column Master Keys)。

@echo off 
echo creating certificate (you might want to set a password on this)... 
makecert.exe -n "CN=MyCompany Always Encrypted Master Key 2017" -r -eku 1.3.6.1.5.5.8.2.2,1.3.6.1.4.1.311.10.3.11 -sky exchange -sp "Microsoft Enhanced RSA and AES Cryptographic Provider" -sy 24 -len 2048 -a sha256 -e 01/01/2040 -sv MyCompanyAlwaysEncryptedMasterKey2017.pvk MyCompanyAlwaysEncryptedMasterKey2017.cer 

echo merging to pfx (please check to export private key and set a password)... 
pvk2pfx -pvk MyCompanyAlwaysEncryptedMasterKey2017.pvk -spc MyCompanyAlwaysEncryptedMasterKey2017.cer 

echo done! install your new .pfx into the localmachine certificate store and create a reference to it in sql server! 
echo note, backup the .pfx - the certificate private key is marked as non-exportable once installed into the certificate store. 
pause 

我借了一些makecert.exe參數從Increase validity of Always Encrypted Certificate

編輯2:後一對夫妻帶着這個工作日內,我們決定不去生產與始終是加密的,因爲它能夠在後SSMS(以及始終加密的參數化),一些查詢完全掛起,我們看到很多其他問題出現:例如,每個客戶端(ASP.NET,SQL Server作業,計劃任務,Reporting Services任務)有一個JOIN或一個WHERE總是加密列),該查詢需要參數化...即使我們做了很多 - 我們有更多有創意的查詢(非書本查詢),無法以這種方式進行參數化。然後,LIKE'%xxx%'等等或任何類型的高級TSQL我都不想去考慮。也許我會重新考慮總是加密一個新的解決方案,或再次沒有。這不是。

+1

您可以在服務器上使用TDE並通過SSL連接以保護線路上的數據。 –

+1

這是正確的,但需要注意的是,如果SQL Server受到攻擊,即入侵者獲得對SQL Server的管理訪問權限,上述方法將無法保護數據,因爲數據在SQL Server內存中將以明文形式顯示。 –

回答

2

有兩種方法可以做到這一點,

  1. 使用SQL Server透明數據加密功能,這將在休息的數據進行加密。這意味着數據將由SQL Server在磁盤上加密,數據在客戶端和SQL Server之間的網絡上以純文本形式可見,並且在SQL Server的內存中以純文本形式可見。你可以閱讀更多關於這個功能here

  2. 在SQL服務器中使用Always Encrypted功能,這是一種客戶端加密技術,意味着它將加密客戶端應用程序的驅動程序中的數據。這意味着數據將在客戶端和SQL服務器之間的網絡上進行加密,並在SQL服務器的內存中加密,並在磁盤上進行加密。如果實施正確,它還可以保護獲得SQL服務器上管理權限的入侵者的數據(基本上,您必須確保加密密鑰不存儲在SQL Server上,並且入侵者無法以任何方式訪問加密密鑰)。我將詳細解釋如何執行此操作以及始終加密here提供的安全保證。但是,由於SQL Server無法解密數據,因此您可以對加密數據執行的操作有一些限制。您可以在這裏閱讀關於這些限制的更多信息,https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/always-encrypted-database-engine。您可以瞭解有關始終加密的更多信息here

+0

謝謝!我有一個共享的SQL + IIS組合,所以我猜它不會超級安全(將密鑰存儲在同一臺機器上) - 但它仍然會被加密;並且比沒有加密更好。但是,我認爲生成.PFX(使用makecert和pvk2pfx),然後將其導入到服務器到LocalMachine \ Personal存儲中並通過執行CREATE COLUMN MASTER KEY來引用它會很明智。但是,現在當嘗試使用它創建列加密密鑰時,SQL服務器會失敗,說它找不到證書。有一些我在這裏失蹤的權限嗎? –

+0

通過使用SSMS UI而不是CREATE語句解決了上述問題(我猜想在指紋中肯定寫了一些錯誤)。無論如何,我已經編輯了我的問題,以瞭解如何結束設置Always Encrypted。 –

+0

嗨Fredrik,爲了將來的參考,在這裏我已經解釋瞭如何使用PowerShell創建主密鑰證書。 https://stackoverflow.com/questions/45042715/always-encrypted-create-certificate-error-windows-server-2012/45044128#45044128 –