【问题标题】:Compare Encrypted Bank Account Details without full Decryption在没有完全解密的情况下比较加密的银行账户详细信息
【发布时间】:2023-03-16 03:40:01
【问题描述】:

我正在构建一个存储员工信息的数据库,包括银行账户详细信息。存储银行帐户详细信息,以便我们检查当前或过去使用我们公司的员工,在我们的情况下,这可能是担心欺诈的一个原因。我一直在阅读MSDN 和其他地方的 SQL Server 2008 R2 Encrption and Decryption,并提出了以下示例脚本:

IF NOT EXISTS(SELECT * FROM sys.symmetric_keys WHERE symmetric_key_id = 101)
    CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'BankDetai!5'
GO

CREATE CERTIFICATE Employees_01 WITH SUBJECT = 'Employee Bank Account Details'
GO

CREATE SYMMETRIC KEY AccountNos_01
    WITH ALGORITHM = AES_256
    ENCRYPTION BY CERTIFICATE Employees_01
GO

CREATE TABLE #Bank_Accounts
( Id            INT IDENTITY(1,1)   NOT NULL    CONSTRAINT PK_BankAccount_Id PRIMARY KEY CLUSTERED (Id ASC)
 ,AccountNumber VARBINARY(128)      NOT NULL
 ,BankName      NVARCHAR(255)       NOT NULL
 ,CountryCode   VARCHAR(2)          NOT NULL
 ,CreateDate    DATETIME2(0)        NOT NULL
 ,EmployeeId    INT                 NOT NULL
 ,IsActive      BIT                 NOT NULL
 ,SortCode      VARBINARY(128)      NOT NULL
);

OPEN SYMMETRIC KEY AccountNos_01
    DECRYPTION BY CERTIFICATE Employees_01;

CREATE TABLE #SampleBankAccounts
( Id INT IDENTITY(1,1)
 ,AccountNumber VARCHAR(255)
 ,BankName      NVARCHAR(255)
 ,CountryCode   VARCHAR(2)
 ,EmployeeId    INT NOT NULL
 ,IsActive      BIT
 ,SortCode      VARCHAR(255))

INSERT #SampleBankAccounts
SELECT * FROM
(   SELECT
         '123456789'    AccountNo
        ,'Barclays'     BankName
        ,'US'           Country
        ,1              Employee
        ,1              IsActive
        ,'12-34-56'     SortCode
UNION
    SELECT
         '9876543210'
        ,'Barclays'
        ,'US'
        ,1
        ,0
        ,'12-34-56'
UNION
    SELECT
         '111111111111'
        ,'HSBC'
        ,'UK'
        ,2
        ,1
        ,'222222'
UNION
    SELECT
         'IBAN 123 456 9875 3215'
        ,'Nationwide'
        ,'ES'
        ,3
        ,1
        ,'00_gn321654'
)AS Samples
ORDER BY Employee

MERGE #Bank_Accounts        AS Target
USING #SampleBankAccounts   AS Source   ON Target.EmployeeId = Source.EmployeeId
                                            AND Source.AccountNumber = Target.AccountNumber
                                            AND Source.BankName = Target.BankName
                                            AND Source.CountryCode = Target.CountryCode
                                            AND Source.SortCode = Target.SortCode
WHEN NOT MATCHED
    THEN INSERT (AccountNumber, BankName,CountryCode,CreateDate,EmployeeId,IsActive,SortCode)
        VALUES (
             ENCRYPTBYKEY(KEY_GUID('AccountNos_01'),Source.AccountNumber)
            ,Source.BankName
            ,Source.CountryCode
            ,GETDATE()
            ,Source.EmployeeId
            ,Source.IsActive
            ,ENCRYPTBYKEY(KEY_GUID('AccountNos_01'),Source.SortCode));
GO


DROP TABLE #SampleBankAccounts

这似乎工作正常,但现在我需要一个变量,例如@AccountNo 并查看它是否与我们存储的任何银行帐户匹配(我很可能会使用存储过程)。如果可能的话,我宁愿避免在任何脚本中解密,所以我想知道是否可以加密 @AccountNo 变量然后比较它,所以我们可能会看到匹配:

DECLARE @MyTestBankAccount NVARCHAR(255) = '123456789'
DECLARE @MyEncryptedTestBankAccount VARBINARY(128)

OPEN SYMMETRIC KEY AccountNos_01
    DECRYPTION BY CERTIFICATE Employees_01;

SELECT @MyEncryptedTestBankAccount = ENCRYPTBYKEY(KEY_GUID('AccountNos_01'),@MyTestBankAccount)

SELECT
     AccountNumber
    ,EmployeeId
FROM Bank_Accounts
WHERE
    @MyEncryptedTestBankAccount = AccountNumber

这不起作用;如您所见,我使用了应该出现在表中的帐号,但没有返回任何结果。我试图解密帐号列并将其与变量进行比较,但我得到了一堆汉字(就像在this question中一样),它们与加密和解密变量创建的字符不匹配,所以这也不适用于比赛......

那么为什么下面的查询(使用上面的数据)没有为我提供帐户详细信息的加密和解密值?我可以使用此方法针对给定的银行账户搜索员工的银行账户吗?

OPEN SYMMETRIC KEY AccountNos_01
    DECRYPTION BY CERTIFICATE Employees_01;
SELECT
     AccountNumber                                  AS Encrypted_AccountNo
    ,EmployeeId                                     AS EmployeeId
    ,CONVERT(NVARCHAR,DECRYPTBYKEY(AccountNumber))  AS Decrypted_AccountNo
FROM Bank_Accounts

【问题讨论】:

  • 以纯文本形式存储帐号真的是错误的吗?如果我是客户并且我知道我的帐号,我可能可以毫不费力地猜到另一个,对吧?如果必须保持帐户 # 加密,那么添加另一个带有帐户 # 散列的列怎么样,大多数时候散列帐户 # 在数据库中是唯一的,但您可能会遇到需要加载的情况匹配哈希,直到找到正确的帐户。
  • 我认为这个问题属于 Information Security SE 网站,因为它真正处理的是最佳可行实践,而不是代码问题。
  • 不幸的是,加密帐号是必须的,这意味着这对我来说是一个代码问题,因为我无法从数据库中检索加密的银行账户信息以供使用,无论是明文还是明文或以某种加密形式。从 MSDN 文章看来,它应该会发生,但我的脚本失败了。

标签: sql sql-server sql-server-2008-r2 encryption-symmetric sensitive-data


【解决方案1】:

于是我找到了答案:退出 SQL Server 并重新进入。

必须更新一些东西才能工作,因为现在一切都很好。

~轻声尖叫~

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-06
    • 1970-01-01
    • 1970-01-01
    • 2016-03-19
    • 2014-08-16
    • 1970-01-01
    • 2014-06-08
    • 1970-01-01
    相关资源
    最近更新 更多