正如标题所说,我正在尝试在 SQL 中实现 RFC4226“HOTP:基于 HMAC 的一次性密码算法”的编程部分。我想我有一个可以工作的版本(对于一个小测试样本,它产生与代码中的 Java 版本相同的结果),但它包含一对嵌套的 hex(unhex()) 调用,我感觉可以做得更好。我受制于 a) 需要执行此算法,以及 b) 需要在 mysql 中执行,否则我很乐意查看其他执行此操作的方法。
到目前为止我得到了什么:
-- From the inside out...
-- Concatinate the users secret, and the number of time its been used
-- find the SHA1 hash of that string
-- Turn a 40 byte hex encoding into a 20 byte binary string
-- keep the first 4 bytes
-- turn those back into a hex represnetation
-- convert that into an integer
-- Throw away the most-significant bit (solves signed/unsigned problems)
-- Truncate to 6 digits
-- store into otp
-- from the otpsecrets table
select (conv(hex(substr(unhex(sha1(concat(secret, uses))), 1, 4)), 16, 10) & 0x7fffffff) % 1000000
into otp
from otpsecrets;
有没有更好(更有效)的方法来做到这一点?