使用加密的ID

时间:2009-09-21 14:54:23

标签: c# hash

故障单具有整数ID。

我们决定用户不应该与整数ID进行交互(请参阅,输入搜索参数),因为它是顺序的,可预测的。

因此用户应使用加密ID。它应该有八个字符,字母和数字之间,避免看起来像(0,o,1,l,5,s,u,v),而不是顺序。

您认为哪种算法最适合生成此加密ID,这种双向可转换字符串? (从id到加密,从加密到id)

谢谢!

修改:hashed =>加密

5 个答案:

答案 0 :(得分:4)

根据定义,散列不能转换回原始散列。

如果您希望以编程方式完成双向转换,那么您要找的是加密

或者,您可以使用基于数据库的方法。您为整数生成哈希(甚至更好的唯一标识符)并将它们存储在映射表中。然后,您可以根据其哈希(标识符)轻松找到原始文件。

答案 1 :(得分:1)

一种简单的方法:

  • 声明一个包含 想要使用的所有字符的字符串。
  • 要获取哈希值,请使用故障单ID作为种子
  • 创建Random的新实例
  • 从这个Random实例中取出前8个随机数,并使用这些数字索引到字符串中以确定8个随机字符。

然而,这确实会创建一个哈希,因为它可能不是唯一的(或可逆的)。你确定这对你的目的没问题吗?

为什么不在创建新票证时生成随机的“可见票证ID”,重复生成8个(或更多?)个字符的随机字符串,直到您避免碰撞为止 - 然后存储该可见票证ID以及故障单数据(以便您稍后在用户向您提供时搜索)。

字母越大,使用的字符越多,碰撞的几率就越小。

请注意,基于顺序票证ID生成的随机“可见ID”的一个好处是,您不是通过默默无闻地依赖安全性...如果您使用某些东西可预测地从相同的ID创建相同的字符串,然后如果有人计算出该算法,您将有效地返回到您开始的位置(他们可以计算出“当前”序列号并生成下一个可见的票证ID。)

答案 2 :(得分:0)

我认为您不想对数据进行哈希处理,而是对其进行编码。 (哈希是一种单向算法)

要创建编码器/解码器,您只需执行以下操作:

编码 - 创建一组有效符号 - 获取ID,将其除以您拥有的符号数 - >剩余成为你符号aray的索引 - >将这封信附加到你已经拥有的那封信上。 - 获取地板结果并从步骤2开始,直到结果小于1

解码: 取第一个符号,并在数组中获取它的索引。 将其添加到符号数组中正在运行的total *元素中 采取下一个符号并继续第2步

答案 3 :(得分:0)

如果你担心的是URL中id的可预测性,你可以简单地在你的用户表中添加另一列,其中包含行id的哈希值。您不一定非必须使用可逆算法,并且可以通过检查表中的其他行来确保哈希是唯一的。

如果性能有问题,您可能希望在此列上添加索引,因为您会经常选择它。

答案 4 :(得分:0)

您可以创建一个加密值供用户查看和使用,然后在使用它时解密。我认为更好的解决方案是创建一个散列ID值作为对象的一部分,正如其他人所建议的那样,但是如果你想要加密/解密路由,下面是我们为动态加密id所做的。您可以将id加密为字符串并向用户显示该字符串,然后在从用户传入时解密该字符串。

我们在'DESCryptoServiceProvider'类周围实现了一个包装器,因此可以加密字符串并解密回字符串。我们使用它来在查询字符串中包含ID。我们ToString()ids使它们成为我们可以加密的字符串。我们的包装类Encrypt方法返回base64编码的字符串。我们的包装器类负责将字符串输入转换为字节数组,加密并将加密的字节数组作为base64编码的字符串返回。我们的包装器上的Decrypt方法接受一个字符串,base64编码的字符串,并将其解密为明文字符串。然后,您必须将明文解析回int。如果在url中使用,则必须注意在将base64编码的字符串放入url之前对其进行UrlEncode。

我们使密钥可配置,因此可以跨机器共享密钥以进行网络耕作,因此在一个网站上加密的ID可以在其他网站上解密。