【问题标题】:Obfuscate decimal(6,2) number using T-SQL使用 T-SQL 混淆十进制 (6,2) 数
【发布时间】:2016-11-01 21:37:30
【问题描述】:

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

  • 11.68
  • 6.84
  • 7.99
  • 7.00

所以大小相似的数字的值的微小差异不会立即可见?

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

您知道将小数 (6,2) 转换为另一个数字(可以像 float 甚至是 int)并返回仅依赖于 T-SQL math functions 吗?


我想在价值观和拥有完整数据库访问权限的人之间再增加一道障碍,他们可能会倾向于分析他们看到的真实(未混淆)值,但相对懒惰学习 T-SQL 和研究“无意义的价值观”如何混淆后看到的,可以解码。

【问题讨论】:

  • 你应该在这里给出一个合适的“混淆”的例子。你的意思是随机捏造它们吗?
  • @tadman – 是的,我的意思是即使在 0~9999 的可能范围内,人类大脑也无法轻易找到模式,大多数值在 6、7、8 左右。所以即使是半随机分布也可以直到它可以被解码回原来的十进制(6,2)数。
  • 如果您要添加此类混淆以防止人们进入您的数据库时进行某种“解码”,那么您就是在打一场无法取胜的战斗。保护您的数据。不要让人靠近它。如果有人得到了损坏的数据以及您为解码它而制作的应用程序,那么您就白白完成了所有这些工作,只需一行代码即可撤消。这是一个傻瓜的差事。黑客并不懒惰。他们非常坚持。
  • @tadman – 我完全理解你的观点,我的想法也一样,但是,在这种情况下,这不是一个公司环境,在那里一切都可以保持在适当的角色和责任之下。如果有人可以离开一段时间思考“你为什么需要这个”并提出有趣的数学函数,我将不胜感激。就算我不会用,那至少看看这样的函数是怎么构造的吧。
  • 这段代码很可能会在以后导致难以追踪的问题。如果这会在没有人注意到的值中引入少量错误,直到为时已晚?使用原始值。如果您需要加密(这可能是一个问题),请使用适当的加密方法进行加密,而不是使用一些自制的混淆器。

标签: tsql decimal obfuscation deobfuscation


【解决方案1】:

使用 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 数据类型中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-06
    • 2020-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多