问题首先看起来很简单:只需指定一个id并用二进制表示。
问题出现是因为用户能够将0位更改为1位。为了澄清,哈希可以从0011到0111或1111,但从不到1010.每个位都有相同的机会被更改,并且与其他更改无关。
为了从哈希转到什么,你需要存储什么?>用户假设用户篡改的比例很低?我还假设在某些情况下失败,因此正确的解决方案应该具有可接受的错误率。
我估计被篡改的最大位数约为总数的30%。
我猜可接受的错误率取决于所需的哈希数和每个哈希设置的位数。
我担心有足够的操作,无法从哈希重建id。我想问的问题是我可以用什么安全防护装置或独特的定位系统来确保这种情况发生。
答案 0 :(得分:2)
我的问题并不完全清楚。
您是说要根据用户ID的哈希验证用户,但是担心用户可能会更改哈希中的某些位?
如果这是问题所在,那么只要您使用经过验证的哈希算法(例如MD5),用户操纵其哈希位以获得其他用户ID的风险就会非常低。
如果那不是你想要的,你会澄清你的问题吗?
修改
在阅读澄清之后,看起来您可能会在Forward Error Correction之后,这是一系列允许您重建更改数据的算法。
基本上使用FEC,您将每个位编码为一系列3位,并在再次解码时应用“多数赢”原则。编码时,将“1”表示为“111”,将“0”表示为“000”。解码时,如果大多数编码的3位为零,则将其解码为零。如果大多数编码的3位为1,则将其解码为1。
答案 1 :(得分:1)
为每个用户分配一个具有相同位数的ID。
这样,您可以立即检测是否发生了任何篡改。如果您在任何两个ID之间另外至少 2n 之间进行Hamming distance,那么在小于 n 位的情况下,您将能够重建原始ID已经确定。
答案 2 :(得分:0)
所以你试图分配一个“唯一ID”,即使它被改为别的东西,它仍然是一个唯一的id?
如果唯一的“篡改”是将0改为1(但反之亦然)(这似乎是相当有用的),那么你可以通过为每个用户分配一个特定的位位置来获得有效的“ID”,将该位设置为该用户的id为零,而其他用户的id为1。
因此,用户的任何摆弄都会导致破坏自己的身份,但不允许冒充他人。
答案 3 :(得分:0)
两个ID之间的距离(从一个单词到另一个单词需要更改的位数)称为汉明距离。错误纠正码可以纠正这个距离的一半,仍然可以给你原始的单词。如果假设30%的位可以被篡改,这意味着2个字之间的距离应该是位的60%。这留下了40%的空间用于ID。只要您为给定的位数(也包括纠错部分)随机生成最多40%的ID,您就应该能够恢复原始ID。