2017-07-27 43 views
1

我希望有人能幫我解決我的問題。我一直負責撰寫將由我們的人力資源部門使用的計劃。該程序將是Intranet的一個子集,並將根據用戶的部門進一步進行限制。該計劃將包含一個員工檔案,該檔案將存儲一些敏感信息,如社會安全號碼。我試圖找到加密SSNs的最佳方式,以便它們不可讀爲數據庫中的純文本。如何使用VB.NET中存儲在web.config中的密鑰加密字段?

我發現代碼可以使用System.Security.Cryptography命名空間使用一些VB.NET內置函數,如here所述。

該代碼的作用是將數據插入數據庫時​​,該字段已加密。我面對的這個問題是,當我想讓員工退後時,我無法解密它。我的猜測是因爲我做這個,我需要解密的值在頁面上:

Dim rsa As New RSACryptoServiceProvider 

它們基本上將定義一個新的加密服務提供商,而不是我用來擺在首位的加密數據的一個。我想知道,如果你做新的RSACryptoServiceProvider它會出現一個新的公/私鑰對?

我的下一個想法是瞭解如何將加密和解密密鑰存儲在web.config中,以便無論用戶在數據上的哪個頁面都可以解密。我沒有找到一個很好的例子,因爲我看到的所有內容都顯示瞭如何在web.config中加密/解密字段(例如密碼和數據庫連接),而不是在應用程序中實際使用它。這是一個加密數據的好方法嗎?如上所述,這將是內聯網的一個子集,因此應用程序將在本地舉行,而不會暴露於外部。我只是非常不舒服,因爲SSN在數據庫中可讀。

這是我第一次進入加密,所以我很抱歉,如果這是一個簡單的問題。

我在連接到SQL SERVER 2008 R2的Visual Studio 2015中使用VB.NET。我願意接受任何人的建議。

+0

爲什麼你需要的SSN控制Intranet訪問配置文件?似乎這些信息根本就不需要。我知道我不想爲了這個目的而給我的SSN。 –

+0

謝謝你的迴應。 SSN與控制Intranet訪問的配置文件無關。 SSN將用於只有HR會使用的員工檔案中。只有HR才能夠根據Active Directory權限訪問此頁面。我需要員工檔案中的SSN,因爲他們的想法是,如果人力資源需要,他們可以重新創建員工的一切。 SSN將存在於加密該字段的員工數據庫中。希望這是有道理的。 – msdev23

回答

0

我已經想出瞭如何去做我正在尋找的東西。儘管Alex的解決方案有效,但在VB.NET代碼中完成加密提供了傳遞不同密鑰的功能,以便可以對不同部分的數據進行不同的加密。本質上,如果有人碰巧得到其中一個密鑰,他們只會獲得一些數據,而不是全部。這不是一個完美的解決方案,但它比在數據庫中顯示明文字段要好。

我創建了一個類文件,並將其放在App_Code文件夾中,並將其命名爲Simple3Des。這個類看起來是這樣的:

Imports System.Security.Cryptography 

Public Class Simple3Des 

    Private TripleDes As New TripleDESCryptoServiceProvider 

    Private Shared Function TruncateHash(ByVal key As String, ByVal length As Integer) As Byte() 
     Dim sha1 As New SHA1CryptoServiceProvider 
     //hash the key 
     Dim keyBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(key) 
     Dim hash() As Byte = sha1.ComputeHash(keyBytes) 
     //truncate or pad the hash 
     ReDim Preserve hash(length - 1) 
     Return hash 
    End Function 

    Public Shared Function EncryptData(ByVal plaintext As String, ByVal key As String) As String 
     //convert the plaintext string to a byte array 
     Dim threeDes As New TripleDESCryptoServiceProvider 
     threeDes.Key = TruncateHash(key, threeDes.KeySize \ 8) 
     threeDes.IV = TruncateHash("", threeDes.BlockSize \ 8) 
     Dim plaintextBytes() As Byte = System.Text.Encoding.Unicode.GetBytes(plaintext) 
     //create the stream 
     Dim ms As New System.IO.MemoryStream 
     //create the encoder to write the byte array to the stream 
     Dim encStream As New CryptoStream(ms, threeDes.CreateEncryptor(), System.Security.Cryptography.CryptoStreamMode.Write) 
     encStream.Write(plaintextBytes, 0, plaintextBytes.Length) 
     encStream.FlushFinalBlock() 
     //convert the encrypted stream to a printable string 
     Return Convert.ToBase64String(ms.ToArray) 
    End Function 

    Public Shared Function DecryptData(ByVal encryptedtext As String, ByVal key As String) As String 
     //convert the encrypted text string to a byte array 
     Dim threeDes As New TripleDESCryptoServiceProvider 
     threeDes.Key = TruncateHash(key, threeDes.KeySize \ 8) 
     threeDes.IV = TruncateHash("", threeDes.BlockSize \ 8) 
     Dim encryptedBytes() As Byte = Convert.FromBase64String(encryptedtext) 
     //create the stream 
     Dim ms As New System.IO.MemoryStream 
     //create the decoder to write to the stream 
     Dim decStream As New CryptoStream(ms, threedes.CreateDecryptor(), System.Security.Cryptography.CryptoStreamMode.Write) 
     //use the crypt stream to write the byte array to the stream 
     decStream.Write(encryptedBytes, 0, encryptedBytes.Length) 
     decStream.FlushFinalBlock() 
     //convert the plaintext stream to a string 
     Return System.Text.Encoding.Unicode.GetString(ms.ToArray) 
    End Function 

End Class 

然後用下面調用類:

//to encrypt 
Simple3Des.EncryptData("Data to encrypt", "key") 
//to decrypt 
Simple3Des.DecryptData("Data to decrypt", "key") 
0

您必須記住,加密數據只受加密密鑰保護。在web.config或任何其他文件中存儲加密密鑰雖然方便,但並不十分安全。做你想要使用的數據庫工具只是什麼

一種方法是:

要使用數據庫的密鑰進行加密的SSN列,這可以讓你控制誰有權訪問密鑰,因此誰可以解密數據。 您可以選擇創建一個試圖解密數據的視圖,或者如果用戶無權訪問解密密鑰,則返回NULL。

我會建議使用KEY_SOURCE字符串創建密鑰,以便在發生災難時可以重新創建它們,也可以備份數據庫主密鑰,如果不這樣做,以及未執行恢復測試,則可能會使您處於無法挽回的數據丟失。

更多詳細信息請參閱以下文章: https://www.mssqltips.com/sqlservertip/3081/using-views-to-expose-encrypted-data-in-sql-server/

+0

謝謝,我認爲這可行。我不確定我是否錯過了什麼,加密/解密密碼從哪裏來?它是否會作爲我的vb.net應用程序的參數傳入視圖中?否則,如果他們在視圖中,訪問數據庫的任何人都無法看到密碼並可以訪問該信息? – msdev23

+0

因爲解密授權是由SQL Server中的用戶權限處理的,所以不需要解密密碼,即非常簡單地說:用戶A連接到數據庫,數據庫檢查用戶A是否有權使用解密密鑰,如果用戶A可以查看數據,如果不是則返回空值 – Alex

+0

我建議你閱讀[SQL Server加密](https://docs.microsoft.com/en-us/sql/relational-databases/security/encryption/sql-server-加密),然後再開始進行任何更改。我還強烈建議您遵循現有的一種方法,而不是自己開發。在設計/實現中做一個小的省略是很容易的,這會大大降低總體安全性。 – Alex

相關問題