hash - 选择校验位算法
问题描述
我正在生成随机 OTP 样式的字符串,作为短期标识符来链接两个原本不相关的系统(它们在每一端都有身份验证)。这些需要用户读取并重新输入,因此为了降低错误率并减少伪造的机会,我想将其中一个数字作为校验位。目前我的随机字符串符合模式(删除I
并O
避免混淆):
^[ABCDEFGHJKLMNPQRSTUVWXYZ][0-9]{4}$
我想为支票附加一个额外的十进制数字。到目前为止,我已经将它实现为一个 BLAKE2 哈希(来自 libsodium),它被转换为十进制并截断为 1 个字符。这仅给出了校验位的 10 种可能性,这并不多。我的主要目标是检测输入中的单个字符错误。
这种方法很有效,但似乎一个数字不足以检测单个字符错误,例如,未检测到的错误很容易找到K37705
并且K36705
都被认为是有效的。
我没有在这个 OTP 中加入时间价值;相反,它纯粹是随机的,我依赖于记录最近为每个用户生成的 OTP,这些 OTP 会定期删除,并且我正在通过速率和尝试计数限制来减少暴力破解的机会。
我猜BLAKE2在这里不是一个好的选择,但鉴于结果只有10种可能性,我不知道其他人会更好。什么是更好的算法/方法?
解决方案
框架挑战
为什么需要校验位?
它不会提高安全性,对于大多数人来说,五位数是微不足道的。检查是否是服务器端,如果错误则返回错误消息。
正常的 TOTP 令牌通常是 6 位数字,并且像谷歌这样的行为者已经确定人们通常设法得到它们的正确性。
推荐阅读
- kdb - 从 kdb 中的 TP 重放日志文件时,RDB 和 TP 之间的消息数差异
- r - 来自不同包的具有相同名称的 R S4 类
- javascript - 如何从module.exports.x lamba serverless主体中的github url获取数据json?
- git - Git 在合并到 master 时忽略分支上的更改
- powershell - 使用相对路径的批处理文件中的 PowerShell
- homebrew - gurgle 可以在 Homebrew 上使用吗?
- javascript - 根据 Material UI 中的用户输入使 TextField 错误为真
- python-3.x - Python 导入函数而不执行脚本
- vb.net - 为什么在 StartupForm 更改后 Form2 中没有收到来自 Form3 的输入
- azure-sql-database - Azure SQL 托管实例