2

我正在尝试开发一个网站和一个相应的帮助程序(安装在用户计算机上)。网站和程序会相互通信(主要是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 上都会增加“计数器”=> 新种子)
  • 将每分钟更改一次(取决于时间)。
  • 绑定到一个动作(登录,...),它取决于一个特定的动作。
  • 可以很容易地单独生成,然后再同步。

如果每个请求都包含 OTP 代码和计数器值,这是否安全?如果不是,您有什么技巧来实现这一目标?我真的想要我上面提到的所有这些属性。

提前致谢。

4

2 回答 2

6

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

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

于 2011-12-20T12:54:55.813 回答
4

为此已经存在一个标准,称为HOTP ( RFC 4226 )。您应该使用它而不是重新发明轮子,因为它已经过比我们更有密码学经验的人的审查。

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

于 2011-12-21T03:58:43.180 回答