我正在使用包含敏感信息(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.
答案 0 :(得分:1)
加密将数据转换为一系列不可读的字符,这些字符不是固定长度的。
哈希是从一串文本生成的字符串或数字。结果字符串或数字是固定长度。
加密和散列之间的主要区别在于,如果您拥有正确的密钥并且散列适合存储密码,则加密的字符串可以反转回原始的解密形式。
1)如果您想使用散列来保护数据的安全性,那么有许多类型的算法,但MD4/5
和SELECT 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 encryption
和CREATE 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)
你无法解密哈希(编辑:除非它已被整体泄露),这就是哈希的重点。如果您只是将哈希值与哈希值进行比较(例如,登录到您的应用程序就是这种情况 - 从不以明文形式存储密码),这将是一个简单的应用程序端工作。
我发现这篇关于安全性的非常方便的文章:
这应该会帮助你。
答案 2 :(得分:0)
在re:2nd选项中:哈希是一种单向操作。它通常无法完成取消它的意图。 (考虑一个密码。它被散列并产生一个256字节的字符串。不是解码产生的散列并将其与裸用户输入进行比较,而是对用户的输入进行散列并比较两个散列。)
我认为您正在寻找使用加密方法知识编写的数据访问层。这是你必须自己创造的东西。 (这是使用存储过程,函数和视图从其中读取数据在静止状态下加密,解密并将其返回给调用者。拒绝用户访问基础表。创建存储过程GetAccountNumber等[您会注意到在这些情况下主键必须是未加密的,因此您可以找到它。其他数据必须以纯文本格式存储,以便您可以正确索引和搜索它。您不希望发现自己你必须循环遍历表中的每条记录,解密每条记录,找到匹配的地址。])
Microsoft SQL Server的企业版中提供透明数据加密(TDE)。使用TDE,数据在静止时加密,任何可以访问数据库的人都可以访问未加密的数据。对于数据访问层方法也是如此。在某些时候,秘密暴露无遗。发生的地方取决于设计。 TDE可以通过多种不同方式进行配置。
如果符合PCI要求,我会选择TDE的路线。没有企业?小马升级。