0

想象一个值,比如“1234”。我想将该值映射到另一个值,例如“abcd”。约束:

  1. 目标值的长度等于起始值
  2. 映射应该是唯一的。例如 1234 应该只映射到 abcd 和 viseversa
  3. 映射过程应该(非常)难以猜测。例如乘以 2 确实计数
  4. 映射应该是可逆的
  5. 起始值是一个整数
  6. 目标值可以是任何类型

这应该是一个基本算法,最终我会用 Ruby 编写它,但这里无关紧要。

我是按照以下思路思考的:

SECRET = 1234
def to(int)
  SECRET + int * 2
end

def fro(int)
  (int - SECRET)  / 2
end

显然,这违反了约束 1 和 3。

最终目标是匿名化我数据库中的记录。我可能想多了。

4

2 回答 2

4

首先,我宁愿认为您的目标过于雄心勃勃:为什么要限制 6?

其次,从技术上讲,您需要的是整数域的双射

第三,您的约束 3 违反了Kerkoff 的原则。最好使用由密钥管理的众所周知的算法,即使您知道大量整数的结果,也很难推导出密钥。

第四,你匿名反对什么?如果您正在处理个人信息,您将如何防止基于与其他数据的关系而显示 Xyzzy 实际上是 John Doe 的统计分析?有一些关于对抗此类攻击媒介的研究(谷歌例如' k-anonymization ')。

第五,使用现有的密码学原语,而不是试图发明自己的密码学原语。存在经过充分测试的加密算法(例如密码块链接模式中的 AES)——所有现代平台都很好地支持 AES,大概 Ruby 也是如此。然而,加密仍然没有给记录带来任何强烈的匿名性。

于 2009-04-21T08:03:22.217 回答
1

可能值得您提供更多关于您想要实现的目标的详细信息。大概您担心某个邪恶的人会获取您的数据,但是这个邪恶的人是否也同样有可能访问访问您的数据库的代码?是什么阻止他们通过检查您的代码来学习算法?

如果您真的想对数据进行匿名化,那么这通常是一种方式(名称被删除,信用卡值被删除等)。如果您尝试加密数据库的内容,那么许多数据库引擎都提供了经过良好测试的机制来执行此操作。例如:

MSSQL 中处理加密数据的最佳实践

数据库加密

使用产品的加密机制总是比使用自己的加密机制更好。

于 2009-04-21T08:09:04.900 回答