【问题标题】:one-time-password algorithm (both matematical, time based, and action based)一次性密码算法(基于数学的、基于时间的和基于动作的)
【发布时间】:2012-01-24 10:08:28
【问题描述】:

我正在尝试开发一个网站和一个相应的帮助程序(安装在用户计算机上)。网站和程序之间会相互通信(主要是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 代码和计数器值,这是否安全?如果不是,您有什么技巧来实现这一目标?我真的很想要我上面提到的所有这些属性。

提前致谢。

【问题讨论】:

  • 您可以考虑使用hash chain 或其他生成one-time password 的标准方法。如果您正在寻找生成 OTP 的标准库,您可以在 IT Security 上提问。如果您正在编写一个新的库来生成 OTP,您可以在 Cryptography 发布更具体的问题。

标签: algorithm security one-time-password


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-04
      • 2022-01-20
      • 2023-03-23
      • 2011-05-17
      • 2021-05-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多