如何使用对称密钥加密和解密 SQL Server 中的整数数据类型列

Posted

技术标签:

【中文标题】如何使用对称密钥加密和解密 SQL Server 中的整数数据类型列【英文标题】:How to encrypt and decrypt integer data type column in SQL Server using symmetric key 【发布时间】:2018-12-31 07:32:59 【问题描述】:

我可以使用对称密钥加密和解密 varchar、nvarchar、char 列,但不能对 int、datetime、float、bigint 数据类型列执行相同操作

示例表:Mytable

| Id  Code  percentage  name    activity   |  
+------------------------------------------+
| 1   ad     43.43    James    Running     |  
| 3   Pr     70.43    Sam      Cooking     |  
| 5   nt     90.34    Lisa     Walking     |  
| 4   ash    0.00     James    Stealing    |  
| 2   han    0.00     James    Lacking     |  
| 8   ant    73       Sam      Cooking     |

我想分别加密和解密整数和浮点数据类型的 ID 列和百分比。

我正在使用此代码进行加密:

OPEN SYMMETRIC KEY SymKey DECRYPTION BY CERTIFICATE data  

ALTER TABLE Mytable 
SET ADD idencry VARBINARY(128) NULL  


UPDATE Mytable 
SET idencry = ENCRYPTBYKEY(KEY_GUID('datamSymKey'), CONVERT(varbinary, ID))

要解密我正在使用此代码:

SELECT 
    id,
    CONVERT(NVARCHAR(60), DECRYPTBYKEY(idencry )), * 
FROM 
    Mytable

但它没有返回正确的结果......浮点和日期时间日期类型也是如此

【问题讨论】:

请随意添加相关代码,这样用户就会知道你在做什么以及当前代码有什么问题!见Example 这篇文章可能对你有帮助c-sharpcorner.com/UploadFile/chinnasrihari/… 这篇文章也可以解释和展示示例:docs.microsoft.com/en-us/sql/relational-databases/security/… 【参考方案1】:

您好,我已经在 SQL Server 2016 上测试了这些代码,并且可以正常工作:

CREATE CERTIFICATE Test04   
   ENCRYPTION BY PASSWORD = 'pGFD4bb925DGvbd2439587y'  
   WITH SUBJECT = 'Sammamish Shipping Records',   
   EXPIRY_DATE = '20201031';  
GO  

CREATE SYMMETRIC KEY #SymKey   
WITH ALGORITHM = AES_128 
ENCRYPTION BY CERTIFICATE Test04;  
GO  

create Table #TestData
(
    Id int,
    Code varchar(10)
)

Insert into #TestData
(
    Id,
    Code
)
SELECT 1,'AA'
UNION 
SELECT 2,'BB'
UNION 
SELECT 3,'CC'
UNION 
SELECT 4,'DD'
UNION 
SELECT 5,'EE'
UNION 
SELECT 6,'FF'

SELECT * FROM #TestData

OPEN SYMMETRIC KEY #SymKey DECRYPTION BY CERTIFICATE Test04 WITH PASSWORD='pGFD4bb925DGvbd2439587y'

ALTER TABLE #TestData 
 ADD idencry VARBINARY(128) NULL  


UPDATE #TestData 
SET idencry = ENCRYPTBYKEY(KEY_GUID('#SymKey'), CONVERT(varbinary, Id))



SELECT * FROM #TestData


OPEN SYMMETRIC KEY #SymKey DECRYPTION BY CERTIFICATE Test04 WITH PASSWORD='pGFD4bb925DGvbd2439587y'

SELECT 
    Id,
    CONVERT(int, DECRYPTBYKEY(idencry)) AS 'IdDecrypted', * 
FROM 
    #TestData


DROP TABLE  #TestData 

DROP SYMMETRIC KEY #SymKey   

DROP CERTIFICATE Test04

我认为你在使用decryptbykey时必须转换为源类型

 CONVERT(NVARCHAR(60), DECRYPTBYKEY(idencry )), * 

您的“Id”列类型是什么?

你可以试试:

CONVERT(INT, DECRYPTBYKEY(idencry )), * 

【讨论】:

@adams 你找到解决方案了吗?

以上是关于如何使用对称密钥加密和解密 SQL Server 中的整数数据类型列的主要内容,如果未能解决你的问题,请参考以下文章

HTTP的加密

加密解密

TLS过程(DH 非对称加密)

非对称加密和对称加密

图解HTTPS协议加密解密全过程

技术干货丨如何使对称加密“不对称”