use*_*696 2 random math checksum
我有一个应用程序,其中将分配6位数字用于物理访问控制。我遇到的困难是找到一种方法来避免导致有效PIN(来自该位置的一系列PIN)的单个数字或换位错误。我们希望每个位置不再需要1000个PIN。
无法在访问控制点执行校验和,因为它只会根据已批准的PIN列表查找PIN。
有没有人有什么建议?
1000个数字很少。只需有一种算法一次生成一个六位数的随机数。对于生成的每个号码,它都会检查该号码是否已被使用,如果没有,则将其添加到PIN列表中,并标记该号码本身以及所有的一位数字和已转位错误。对于6位十进制数字,可能有6×9 = 54个单位数字错误和6C2 = 15个换位错误(如果只关心相邻的换位,则只有5个),因此该数字本身加上其所有附近的数字等于每个数字70个数字生成的数字,或者需要跟踪的一组70,000个数字。
除了非常简单之外,此方法的最大好处是,它几乎保持了完全随机生成6位数字的全部熵。对任何单个PIN都没有额外的限制,仅对总共一组PIN设置了限制。因此,仅当您拥有相当多的PIN时,理论上您才可以使用它们稍微减少您不知道的PIN的搜索空间。我会说,效果太小了,没有实际意义。即使您知道1000个PIN中的999个,也可以从10 6 = 1,000,000个可能的PIN中排除多达999×70 = 69,930 ,即少于7%。
任何只生成5位数字然后添加校验和的方法,其熵将小于此值,即,通过在较小范围内进行蛮力试验,将更容易找到PIN。
有评论提出了这样一个问题,即整个事情是否值得努力。一方面,实际发生碰撞的机会是多少?有(10 6)1000 = 10 6000个可能的方法可以独立选择PIN(甚至允许重复)。大约有1,000,000×999,930×…=乘积(从0到999的k为10 6?70 k,k)×2.8×10 5984,这样做没有您描述的冲突。这个数字要小得多。这1000个数字中的任何两个之间发生冲突的可能性(类似于生日悖论)将是(10 6000?2.8×10 5984)/ 106000 = 1?2.8×10 ?16?1,因此使用完全随机选择的这种几乎冲突的可能性很高(尽管从数学意义上来说并不是几乎确定的)。但是,这仍然并不意味着其中任何一个PIN的任何单个错误都有很大的机会匹配另一个PIN。
另一方面,您要防范的情况是什么?任何任意数字作为有效PIN的机会都是1000:10 6= 1:1000,无论如何。因此,如果您认为可能性为0.1%,那么一个陌生人很可能会猜出一个有效的PIN。您要防范的是两件事之一。知道PIN身份的人都可以作为其他人。如果您考虑到在某些设置中普通用户输入的PIN和输入错误的PIN比陌生人随机输入的PIN的可能性更大,那么这是有道理的。但是,除非PIN的身份相关,即您根据PIN授予不同的访问权限,或者保留使用了PIN的日志,否则这无关紧要:如果已经使用一个PIN进行访问的人可以使用不同的PIN,那又如何呢?在某些情况下,观察者可能正在观看PIN垫,因此可能会学习几乎正确的PIN,并且您想避免它实际上是偶然地被正确纠正的。
归档时间: |
|
查看次数: |
98 次 |
最近记录: |