0

我有一个成功加密信用卡的脚本。我需要它作为触发器工作,以便对信用卡列所做的任何插入都会自动对其进行加密。现在,我的触发器有效,但信用卡列是 varchar。当应用程序尝试插入时,我会这样做:

声明 @encryptedCreditCardNumber varbinary(max)
SET @encryptedCreditCardNumber = EncryptByKey(Key_GUID('testKey'), @CreditCardNumber));

这很好用,但是我如何将 varbinary(max) 转换为 varchar (这是信用卡列的内容)。在我的公司,信用卡列长期以来一直是 varchar,许多遗留代码都依赖于它是 varchar。

谢谢

4

1 回答 1

1

您最简单的方法是将二进制转换为 base64 并将其存储在 varchar 列中。Base64 是一种使用 ascii 编码呈现二进制数据的方法,以便可以用 XML 等格式表示。您可以通过以下方式执行转换:

select cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:variable("@encryptedCreditCardNumber")))', 'varchar(max)');

这通过 XML 中介将 varbinary 正确编码为 varchar。要反转数据库上的过程,请使用:

select cast(N'' as xml).value('xs:base64Binary(sql:variable("@base64stringvariable"))', 'varbinary(20)');

编辑:有用的参考 - http://blogs.msdn.com/sqltips/archive/2008/06/30/converting-from-base64-to-varbinary-and-vice-versa.aspx

于 2008-10-02T15:57:06.587 回答