2017-07-27 59 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

相关问题