使用 T-SQL 混淆 decimal(6,2) 数字
Obfuscate decimal(6,2) number using T-SQL
如何有效地混淆 0.00 ~ 9999.99 范围内的数字,例如
- 11.68
- 6.84
- 7.99
- 7.00
这样大小相似的数字的值的微小差异不会立即可见吗?
我考虑过将每个数字拆分为整数和小数部分并将它们用作坐标(例如 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
数据类型中。
如何有效地混淆 0.00 ~ 9999.99 范围内的数字,例如
- 11.68
- 6.84
- 7.99
- 7.00
这样大小相似的数字的值的微小差异不会立即可见吗?
我考虑过将每个数字拆分为整数和小数部分并将它们用作坐标(例如 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
数据类型中。