在Vb.net和SQL Server中加密/解密数据
我目前在VB.net应用程序中使用两个函数来加密/解密敏感数据(例如SSN)。然后,我将加密数据存储在SQL Server数据库中。然后,当从SQL Server读取数据时,应用程序将其解密以供显示。这个很好用 此解决方案的问题在于,由于返回的数据是加密的,因此无法编写包含这些加密字段的简单SQL查询。我希望能够运行查询,返回以加密格式存储的原始格式的数据(即实际的未加密数据) 实现这一目标的最佳实践是什么?例如,我是否应该不在VB.net应用程序中使用函数,而是在SQL Server中使用函数?或者,我是否需要创建一个DLL或具有上述两个函数的东西,然后我需要以某种方式“安装”它们,以便可以从SQL Server调用它们?我正在使用SQL Server 2008和Visual Studio 2017 如果相关的话,我已经包含了函数的代码在Vb.net和SQL Server中加密/解密数据,vb.net,encryption,sql-server-2008-r2,Vb.net,Encryption,Sql Server 2008 R2,我目前在VB.net应用程序中使用两个函数来加密/解密敏感数据(例如SSN)。然后,我将加密数据存储在SQL Server数据库中。然后,当从SQL Server读取数据时,应用程序将其解密以供显示。这个很好用 此解决方案的问题在于,由于返回的数据是加密的,因此无法编写包含这些加密字段的简单SQL查询。我希望能够运行查询,返回以加密格式存储的原始格式的数据(即实际的未加密数据) 实现这一目标的最佳实践是什么?例如,我是否应该不在VB.net应用程序中使用函数,而是在SQL Server中使用函数
Private key() As Byte = {}
Private IV() As Byte = {&H12, &H34, &H56, &H78, &H90, &HAB, &HCD, &HEF}
Public Function Decrypt(ByVal sStringToDecrypt As String, _
ByVal sEncryptionKey As String) As String
Dim inputByteArray(sStringToDecrypt.Length) As Byte
Try
key = System.Text.Encoding.UTF8.GetBytes(Left(sEncryptionKey, 8))
Dim des As New DESCryptoServiceProvider()
inputByteArray = Convert.FromBase64String(sStringToDecrypt)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateDecryptor(key, IV), _
CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Dim encoding As System.Text.Encoding = System.Text.Encoding.UTF8
Return encoding.GetString(ms.ToArray())
Catch ex As Exception
Return ex.Message
End Try
End Function
Public Function Encrypt(ByVal sStringToEncrypt As String, _
ByVal SEncryptionKey As String) As String
Try
key = System.Text.Encoding.UTF8.GetBytes(Left(SEncryptionKey, 8))
Dim des As New DESCryptoServiceProvider()
Dim inputByteArray() As Byte = Encoding.UTF8.GetBytes( _
sStringToEncrypt)
Dim ms As New MemoryStream()
Dim cs As New CryptoStream(ms, des.CreateEncryptor(key, IV), _
CryptoStreamMode.Write)
cs.Write(inputByteArray, 0, inputByteArray.Length)
cs.FlushFinalBlock()
Return Convert.ToBase64String(ms.ToArray())
Catch ex As Exception
Return ex.Message
End Try
End Function
“此解决方案的问题在于,由于返回的数据已加密,因此无法编写包含这些加密字段的简单SQL查询。”
我不认为这是一个问题,而是一个好处。在当今时代,任何人都不应该运行“简单”查询来访问诸如SSN之类的敏感信息。您对未加密SSN的访问应严格按照需要进行控制,而不是批量访问。数据隐私法在美国和世界范围内变得越来越严格。我是数据库管理员,需要运行查询以向客户提供数据。我编写的Windows窗体应用程序使用数据,甚至在某些窗体上以解密格式显示数据。在与“客户”的关系中,他们有查看和使用数据的合法权利。我只是在寻找一种更简单的方法来完成上述任务。明白,但即使是作为DBA,您也不应该访问未加密的敏感个人身份信息,如SSN。如果客户机需要查询,您应该构建安全的报告,以便他们能够访问数据。我以前做过,并使用了Telerik Reporting,因为它使通过.NET代码解密传入的数据源变得很容易。我的观点是,访问这类敏感数据不是——也不应该是——琐碎的。当所有这些都说了,做了,我就是编写查询和/或代码的人,为他们提供他们需要的数据。对我来说,这不是琐碎或困难。这是关于以一种对我来说有效的方式做事。如果我可以编写使用与我在应用程序、报表等中使用的相同安全.Net代码的查询,那将是理想的。或者,解决方案可能是修改应用程序以使用SQL Server中的某些函数来加密和解密数据。