首页 > 解决方案 > 选择校验位算法

问题描述

我正在生成随机 OTP 样式的字符串,作为短期标识符来链接两个原本不相关的系统(它们在每一端都有身份验证)。这些需要用户读取并重新输入,因此为了降低错误率并减少伪造的机会,我想将其中一个数字作为校验位。目前我的随机字符串符合模式(删除IO避免混淆):

^[ABCDEFGHJKLMNPQRSTUVWXYZ][0-9]{4}$

我想为支票附加一个额外的十进制数字。到目前为止,我已经将它实现为一个 BLAKE2 哈希(来自 libsodium),它被转换为十进制并截断为 1 个字符。这仅给出了校验位的 10 种可能性,这并不多。我的主要目标是检测输入中的单个字符错误。

这种方法很有效,但似乎一个数字不足以检测单个字符错误,例如,未检测到的错误很容易找到K37705并且K36705都被认为是有效的。

我没有在这个 OTP 中加入时间价值;相反,它纯粹是随机的,我依赖于记录最近为每个用户生成的 OTP,这些 OTP 会定期删除,并且我正在通过速率和尝试计数限制来减少暴力破解的机会。

我猜BLAKE2在这里不是一个好的选择,但鉴于结果只有10种可能性,我不知道其他人会更好。什么是更好的算法/方法?

标签: hashone-time-passwordchecksum

解决方案


框架挑战

为什么需要校验位?

它不会提高安全性,对于大多数人来说,五位数是微不足道的。检查是否是服务器端,如果错误则返回错误消息。

正常的 TOTP 令牌通常是 6 位数字,并且像谷歌这样的行为者已经确定人们通常设法得到它们的正确性。


推荐阅读