将值映射到其他值并返回

时间:2009-04-21 07:37:51

标签: algorithm security mapping obfuscation anonymity

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

  1. 目标值的长度等于起始值
  2. 映射应该是唯一的。例如。 1234应该只映射到abcd和viseversa
  3. 映射过程应该(非常)难以猜测。例如。乘以2会计算
  4. 映射应该是可逆的
  5. 起始值是整数
  6. 目标值可以是任何类型
  7. 这应该是一个基本的算法,最终我会用Ruby编写它,但这里不用担心。

    我在考虑以下几点:

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

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

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

2 个答案:

答案 0 :(得分:4)

首先,我认为你的目标过于雄心勃勃:为什么要约束6?

其次,您需要的是技术上来自整数域的bijection

第三,你的约束3与Kerkhoff's principle相反。使用由密钥控制的众所周知的算法会更好,即使您知道大量整数的结果,也很难导出密钥。

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

第五,使用现有的加密原语而不是尝试发明自己的加密原语。存在加密算法(例如,cipher-block-chaining模式下的AES)经过充分测试 - 所有现代平台都支持AES,也可能是Ruby。但是,加密仍然不会给任何强烈意义上的记录匿名。

答案 1 :(得分:1)

你可能值得提供一些关于你想要实现什么的更多细节。大概你担心一些邪恶的人掌握你的数据,但这个邪恶的人是否也有可能访问访问你的数据库的代码?什么阻止他们通过检查代码来学习算法?

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

Best practices for dealing with encrypted data in MSSQL

database encryption

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