Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Vb.net和SQL Server中加密/解密数据_Vb.net_Encryption_Sql Server 2008 R2 - Fatal编程技术网

在Vb.net和SQL Server中加密/解密数据

在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中使用函数

我目前在VB.net应用程序中使用两个函数来加密/解密敏感数据(例如SSN)。然后,我将加密数据存储在SQL Server数据库中。然后,当从SQL Server读取数据时,应用程序将其解密以供显示。这个很好用

此解决方案的问题在于,由于返回的数据是加密的,因此无法编写包含这些加密字段的简单SQL查询。我希望能够运行查询,返回以加密格式存储的原始格式的数据(即实际的未加密数据)

实现这一目标的最佳实践是什么?例如,我是否应该不在VB.net应用程序中使用函数,而是在SQL Server中使用函数?或者,我是否需要创建一个DLL或具有上述两个函数的东西,然后我需要以某种方式“安装”它们,以便可以从SQL Server调用它们?我正在使用SQL Server 2008和Visual Studio 2017

如果相关的话,我已经包含了函数的代码

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中的某些函数来加密和解密数据。