在访问时解密数据库中的敏感数据

时间:2017-03-15 13:13:57

标签: sql sql-server tsql encryption

我正在使用包含敏感信息(SSN,信用卡等)的数据库,我正在寻找一种保护数据的方法。当我从外部源引入数据时,我需要对它进行加密,但是当我的用户通过使用数据库作为后端的应用程序访问数据时,我也需要对其进行解密。我知道下面的两种方法,但我很好奇是否有任何其他方法可以使用,或者ENCRYPTEDBYPASSPHRASE在这种情况下是否安全。

实施例

Encrypt with Password
ENCRYPTEDBYPASSPHRASE({PASSWORD}, {FIELD})/DECRYPTBYPASSPHRASE({PASSWORD},{FIELD}) -- Which allows me to set a custom password, but could be read through my stored procedures.

HASHBYTES('SHA_512', {PASSWORD}+CAST({SALT} AS NVARCHAR(36))) -- This seems the most secure, but I do not know how to decrypt the data from here.

3 个答案:

答案 0 :(得分:1)

加密将数据转换为一系列不可读的字符,这些字符不是固定长度的。

哈希是从一串文本生成的字符串或数字。结果字符串或数字是固定长度。

加密和散列之间的主要区别在于,如果您拥有正确的密钥并且散列适合存储密码,则加密的字符串可以反转回原始的解密形式。

1)如果您想使用散列来保护数据的安全性,那么有许多类型的算法,但MD4/5SELECT HASHBYTES('MD5', 'Test String') AS Col1, HASHBYTES('MD5', 'Test String') AS Col2 GO SELECT HASHBYTES('SHA1', 'Test String') AS Col1, HASHBYTES('SHA1', 'Test String') AS Col2 GO 是一种很好的算法。

例如,如下所示,使用MD5算法的散列输出产生16字节长的值,而SHA1算法产生20字节长的值:

symmetric key encryption

2)如果您想使用加密,则有两种主要的加密类型,public key encryptionCREATE MASTER KEY ENCRYPTION BY PASSWORD = ‘myStrongPassword’

示例:

要创建对称密钥,我们首先需要使用主密钥和证书设置数据库,这些密钥和证书充当对称密钥库的保护者。

创建数据库主密钥:

CREATE CERTIFICATE MyCertificateName WITH SUBJECT = 'A label for this certificate'

创建证书:

CREATE SYMMETRIC KEY MySymmetricKeyName WITH IDENTITY_VALUE = 'a fairly secure name', ALGORITHM = AES_256, KEY_SOURCE = 'a very secure strong password or phrase' ENCRYPTION BY CERTIFICATE MyCertificateName;

创建对称密钥:

OPEN SYMMETRIC KEY MySymmetricKeyName
DECRYPTION BY CERTIFICATE MyCertificateName
Encrypting data

加密和解密数据:

打开密钥:

在开始加密或解密数据之前,必须先初始化密钥。这是通过以下代码完成的。

DECLARE @Result varbinary(256) 
SET @Result = EncryptByKey(Key_GUID('MySymmetricKeyName'), @ValueToEncrypt)

您可以使用EncryptByKey函数加密数据,如下所示:

DECLARE @Result varchar(max)
SET @Result = DecryptByKey(@ValueToDecrypt)

请注意,上述加密的结果是varbinary类型(256),如果您希望将值存储在列中以使用此类型。

解密数据:

您可以使用DecryptByKey函数解密数据,如下所示:

{{1}}

答案 1 :(得分:0)

你无法解密哈希(编辑:除非它已被整体泄露),这就是哈希的重点。如果您只是将哈希值与哈希值进行比较(例如,登录到您的应用程序就是这种情况 - 从不以明文形式存储密码),这将是一个简单的应用程序端工作。

我发现这篇关于安全性的非常方便的文章:

https://security.stackexchange.com/questions/16939/is-it-generally-a-bad-idea-to-encrypt-database-fields

这应该会帮助你。

答案 2 :(得分:0)

在re:2nd选项中:哈希是一种单向操作。它通常无法完成取消它的意图。 (考虑一个密码。它被散列并产生一个256字节的字符串。不是解码产生的散列并将其与裸用户输入进行比较,而是对用户的输入进行散列并比较两个散列。)

我认为您正在寻找使用加密方法知识编写的数据访问层。这是你必须自己创造的东西。 (这是使用存储过程,函数和视图从其中读取数据在静止状态下加密,解密并将其返回给调用者。拒绝用户访问基础表。创建存储过程GetAccountNumber等[您会注意到在这些情况下主键必须是未加密的,因此您可以找到它。其他数据必须以纯文本格式存储,以便您可以正确索引和搜索它。您不希望发现自己你必须循环遍历表中的每条记录,解密每条记录,找到匹配的地址。])

Microsoft SQL Server的企业版中提供透明数据加密(TDE)。使用TDE,数据在静止时加密,任何可以访问数据库的人都可以访问未加密的数据。对于数据访问层方法也是如此。在某些时候,秘密暴露无遗。发生的地方取决于设计。 TDE可以通过多种不同方式进行配置。

如果符合PCI要求,我会选择TDE的路线。没有企业?小马升级。