一次性密码算法(数学,基于时间和基于行动)

时间:2011-12-20 12:37:07

标签: algorithm security one-time-password

我正在尝试开发一个网站和相应的帮助程序(安装在用户计算机上)。网站和程序将相互通信(主要是AJAX),但如果任何其他网页可以向程序发送请求,则存在很大的安全风险。我想提出一个解决方案,这使得向我的程序(安装在用户计算机上)注入欺诈请求非常困难。我的想法是使用一次性密码,但我的安全知识有限,因此请问你的想法。

我想出了这种一次性密码算法(伪):

function otp(seed, counter, unix_timestamp, action)
{
    for(i = 0; i < counter; ++i)
    {
        seed = sha256(seed + i);
    }
    str = seed;

    str = sha256(str + unix_timestamp/60);
    str = sha256(str + action);
    otp = substr(str,0,4); //Convert the first for bytes to an int.
    return (int)otp;
}

它应具有以下属性:

  • 只能使用一次,(每个otp生成将#34;计数器&#34;增加=&gt;新种子)
  • 每分钟都会改变(取决于时间)。
  • 绑定到某个操作(登录,...),它取决于具体的操作。
  • 可以轻松生成,然后再进行同步。

如果每个请求都包含OTP代码和计数器值,这是否安全?如果没有,你有什么建议来完成这个?我真的想要上面提到的那些属性。

提前致谢。

2 个答案:

答案 0 :(得分:6)

原则上你的方法是明智的。但请记住,对哈希函数的多次调用毫无意义 - 要么在第一次传递时是安全的,要么根本不是。 此外,您现在只使用种子来实际验证请求(潜在的攻击者会知道其他任何事情),种子生成中的任何弱点都会成为身份验证的弱点。

我不知道SHA256的具体缺点。但是,您的问题通常很常见,并且更容易用标准术语来描述和解决。您想验证对程序的请求。您的远程程序需要安全地确定请求的真实性。使用公钥加密最容易解决这个问题。例如,创建一个GnuPG密钥对,将私钥保存在您的网站上并使用您的程序分发公钥,并使用私钥对您发送到程序的任何命令进行签名。客户端程序正常接收请求,只需要通过一次调用GnuPG来验证其真实性。

答案 1 :(得分:4)

已经有一个标准,称为HOTPRFC 4226)。您应该使用它而不是重新发明轮子,因为它已经被密码学方面比我们更多的人审查过。

你还没有说明你的对手是谁;如果他们是自己机器上的用户,你应该记住,实际上不可能阻止他们破坏你想要发明的任何方案。