使用 T-SQL 混淆 decimal(6,2) 数字

Obfuscate decimal(6,2) number using T-SQL

如何有效地混淆 0.00 ~ 9999.99 范围内的数字,例如

这样大小相似的数字的值的微小差异不会立即可见吗?

我考虑过将每个数字拆分为整数和小数部分并将它们用作坐标(例如 11.68 → (11, 68))并将它们转换为极坐标,这很好,但我仍然需要两个值来存储它们。

你知道 decimal(6,2) 到另一个数字(可以像 float 甚至 int)的一些很好的转换,并且只依赖于T-SQL math functions?


我想在值和拥有完整数据库访问权限的人之间再增加一个障碍,这些人可能很想分析他们看到的真实(未混淆的)值,但相对懒惰学习 T-SQL 和研究 "nonsense values" 他们在混淆后看到的内容是如何被解码的。

使用 ENCRYPTBYPASSPHRASE() 和 DECRYPTBYPASSPHRASE()

自 SQL Server 2008 以来已经存在合适的方法。它们的目的是加密,但是好吧,使用本地存储的密码短语它只是一种混淆 :)(无论如何,目前这是预期的问题。)

DECLARE @Value decimal(6,2) = 7.99;
DECLARE @Passphrase varchar(4) = 'abcd';

-- obfuscation
DECLARE @Obf varbinary(50) = ENCRYPTBYPASSPHRASE(@Passphrase, CAST(@Value AS varchar(20)));

-- deobfuscation
SELECT CAST(CAST(DECRYPTBYPASSPHRASE(@Passphrase, @Obf) AS varchar(20)) AS decimal(6,2)) 

以这种方式混淆的值也可以保存在 varchar/nvarchar 数据类型中。