问题标签 [one-time-password]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
2201 浏览

security - 对 CBC 和 ECB 使用相同的 AES 密钥

概述

我试图想出一种方法,让服务器和客户端能够为每个请求生成一个唯一的 IV,这对每个客户端都是不同的,但又是确定性的。我所说的确定性的意思是,服务器可以计算未来任何请求的 IV,只知道起始顺序。

我需要此功能的原因是我使用 AES 加密来实现一次性密码 (OTP) 方案。当客户端登录到服务器时,它会获得一个种子。第一个 OTP 是通过加密这个种子生成的。对于每个后续请求,客户端使用服务器和客户端之间的共享 AES 密钥加密最后一个 OTP。因此,即使攻击者在没有共享密钥的情况下嗅探了最后一个 OTP,他们也无法获得下一个 OTP。OTP 在 CBC 模式下使用 AES 进行加密。如果服务器和客户端不同步,就会出现问题。我计划处理这个问题的方式是在服务器端生成一些 OTP 到未来,看看它们中的任何一个是否与客户端匹配。然而,

在进入我提出的解决方案之前,让我表达我对 AES、IV、CBC 和 ECB 的理解。这样,如果我对自己的基本原理有任何误解,都可以指出并纠正。

理论

欧洲央行

我知道欧洲央行将为使用相同密钥加密的相同明文块产生相同的输出。因此,它不应该用于多个数据块,因为可以通过对数据进行统计分析来辨别明文信息。基于此,如果您可以保证您的数据始终小于 16 字节(128 位),则似乎可以消除统计攻击的问题。此外,如果您还可以保证您永远不会使用相同的密钥加密相同的明文,那么您将永远不会获得相同的输出。因此,在我看来,假设您的系统将始终满足这些非常严格的标准,使用 ECB 是安全的。

CBC和IV

我知道 CBC 旨在消除这两个问题。通过链接块,它消除了 ECB 的多块统计攻击。通过从不为相同的 AES 密钥使用相同的 IV,您消除了使用相同的密钥将相同的明文加密到相同的输出的问题。

键唯一性

如果每个客户端都获得一个生成的 AES 密钥,那么虽然多个用户拥有相同密钥的可能性很小,但机会非常小。因此可以安全地假设没有两个客户端将使用相同的 AES 密钥。

建议的解决方案

我提出的解决方案是给每个客户一个唯一的 AES 密钥。当生成密钥时,计数器将被初始化为一个随机数。每次必须加密某些东西时,计数器都会加一。这个数字将被填充到一个块中,然后在 ECB 模式下使用 AES 加密。这个输出将是我使用 CBC 加密数据的 IV。

如果服务器与客户端的计数器不同步,因为它具有相同的密钥并且 ECB 不需要 IV,它可以继续生成 IV,直到找到一个允许解密数据的 IV。

我的想法是这个 IV 可以免受统计攻击,因为它等于 AES 的块大小。此外,每个用户每次都会有所不同,因为每个用户都将拥有一个唯一的密钥,并且计数器将始终递增。显然,必须安全地传输 AES 密钥(现在客户端正在使用服务器的公共 RSA 密钥加密生成的密钥)。

我的问题

我对提议的解决方案中描述的技术的基本理解是否正确?我提出的解决方案有什么明显的问题吗?使用相同的密钥以建议的方式生成 IV 以及使用 CBC 加密是否存在任何安全漏洞?

我意识到最后一个问题可能很难/不可能回答,因为密码学真的很难,但任何见解都会受到赞赏。

提前致谢。

0 投票
1 回答
337 浏览

one-time-password - OTP.NET 使用什么版本的 .NET?

1.1 还是 2.0 运行时?

还有人有使用 OTP.NET 的经验吗?

0 投票
1 回答
2449 浏览

java - Java字节数组操作

我正在尝试选择字节数组中最后一个字节的低 4 位。这就是我以前在 PHP 中完成的方式,但我是 Java 新手。

谁能指出我使用 Java 的正确方向?

0 投票
3 回答
59127 浏览

python - Python 中的 Google 身份验证器实现

我正在尝试使用可以使用Google Authenticator application生成的一次性密码。

Google 身份验证器的作用

基本上,Google Authenticator 实现了两种类型的密码:

  • HOTP - 基于 HMAC 的一次性密码,这意味着每次调用都会更改密码,符合RFC4226
  • TOTP - 基于时间的一次性密码,每 30 秒更改一次(据我所知)。

Google Authenticator 也可在此处作为开源获得:code.google.com/p/google-authenticator

当前代码

我一直在寻找现有的解决方案来生成 HOTP 和 TOTP 密码,但没有找到太多。我拥有的代码是以下负责生成 HOTP 的代码段:

我面临的问题是我使用上述代码生成的密码与使用适用于 Android 的 Google Authenticator 应用程序生成的密码不同。即使我尝试了多个intervals_no值(正好是第一个 10000,以 开头intervals_no = 0),secret但等于 GA 应用程序中提供的键。

我的问题

我的问题是:

  1. 我究竟做错了什么?
  2. 如何在 Python 中生成 HOTP 和/或 TOTP?
  3. 是否有任何现有的 Python 库用于此?

总结一下:请给我任何有助于我在我的 Python 代码中实现 Google Authenticator 身份验证的线索。

0 投票
2 回答
4152 浏览

algorithm - 一次性密码算法(基于数学的、基于时间的和基于动作的)

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

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

它应该具有以下属性:

  • 只能使用一次,(在每一代 otp 上都会增加“计数器”=> 新种子)
  • 将每分钟更改一次(取决于时间)。
  • 绑定到一个动作(登录,...),它取决于一个特定的动作。
  • 可以很容易地单独生成,然后再同步。

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

提前致谢。

0 投票
2 回答
5431 浏览

java - 用于连接 OTP(一次性密码)的 Web 服务

如帖子标题所述,我有一个项目,其中包括设计一个允许用户与 OTP 连接的 Web 服务。我真的在互联网上搜索过,我发现有一个用于发送 SMS(SMSLib)的 Java API,但是关于在服务器端生成 OTP 并通过我必须做的 Web 服务发送它,我没有找到任何事物。您能否通过向我展示一些讨论此问题的教程来帮助我。

提前致谢

0 投票
3 回答
1962 浏览

bash - 从脚本中使用 otp 调用 ssh

我的公司使用 OTP over ssh(一次性密码)来访问我们的生产机器。交互可能如下所示:

此时,我运行一个 Java 程序,使用从 SSH 获得的信息生成 OTP 响应。 注意:来自 ssh 输出的哈希(本例中为“942 st9621”)必须作为输入传递给下面的命令。每次 ssh 时,此哈希都会更改。

现在我将生成的 OTP(“LAD DARN BHOY TEST ACHE JUTE”)剪切并粘贴到另一个控制台窗口中。

所以,只是为了让一切清楚:我在运行 jop 时需要使用从 ssh 命令生成的数据和我的密码,然后将结果传递回仍在运行的 ssh 命令。

我很想自动化这个过程。基本上,有一个 bash 脚本,它需要一个主机名,要求输入密码,然后调用 ssh,将 otp-md5 代码传递给 jop,然后将 OTP 传递回 ssh。一个不错的选择是不必输入我的密码作为命令行参数,因为这将存储在命令历史记录中,这是一个很大的安全问题。

这可能吗?

谢谢

0 投票
1 回答
445 浏览

one-time-password - 您可以使用一次性密码来加密手机和服务器之间的通信吗?

如果我的应用程序不接受 SSL 与客户端通信,我应该如何加密流量?我需要一些快速的东西(所以公钥算法是不可能的)。我在考虑一次性密码,但问题是由于应用程序大小的限制,我无法在移动应用程序上存储很长的密钥。你会推荐什么?

0 投票
2 回答
4419 浏览

authentication - 授权计算机访问 Web 应用程序

我有一个 Web 应用程序,我的任务是添加安全登录以增强安全性,类似于 Google 添加到 Google 帐户的内容。

用例

本质上,当用户登录时,我们想要检测用户之前是否授权过这台计算机。如果计算机未获得授权,则向用户发送一个一次性密码(通过电子邮件、SMS 或电话),他们必须输入该密码,用户可以选择记住这台计算机。在 Web 应用程序中,我们将跟踪授权设备,允许用户查看他们上次从该设备登录的时间/地点,并根据他们的选择取消对任何设备的授权。

我们需要一个非常轻量级的解决方案(也就是说,不需要安装客户端软件),并且适用于 Safari、Chrome、Firefox 和 IE 7+(不幸的是)。我们将提供 x509 安全性,它提供了足够的安全性,但我们仍然需要为不能或不会使用 x509 的客户提供解决方案。

我的意图是使用 cookie 存储授权信息(或者,可能使用本地存储,降级为 flash cookie,然后是普通 cookie)。

一开始脸红

初始安全登录序列图 跟踪两个单独的值(本地数据或 cookie):表示安全登录令牌的哈希值和设备令牌。这两个值都由 Web 应用程序驱动(和记录),并指示给客户端。SSO 令牌取决于设备以及序列号。这有效地允许设备被取消授权(所有 SSO 令牌都变得无效)并通过使用序列号和使用随机数来减轻重放(虽然不是有效的,这就是我问这个问题的原因)。

问题

使用此解决方案,某人可以只复制 SSO 和设备令牌并在另一个请求中使用。虽然序列号将帮助我检测此类滥用并因此取消对设备的授权,但检测和响应只能在有效设备和恶意请求都尝试访问之后发生,这是造成损害的充​​足时间。

我觉得使用 HMAC 会更好。跟踪设备、序列,使用私钥创建随机数、时间戳和散列,然后将散列和这些值作为纯文本发送。服务器做同样的事情(除了验证设备和序列)并进行比较。这似乎更容易,也更可靠......假设我们可以安全地协商、交换和存储私钥。

问题

那么,如何安全地为授权设备协商私钥,然后安全地存储该密钥?至少,如果我满足于使用本地存储或闪存 cookie 存储私钥并只是说它“足够好”,是否更有可能?或者,我可以对我的原始草案做些什么来减轻我描述的漏洞?

0 投票
1 回答
3807 浏览

c# - C#中的一次性密码在一段时间后过期?

我正在为 C#.net 中的一个网站创建一个登录页面,遇到了一个问题,希望你们能帮助我。

情况是这样的:用户来到登录屏幕,然后从那里输入他们的电子邮件,我们将参考数据库来检查有效性,如果有效,将随机生成一个 8 位密钥生成并发送到电子邮件。用户现在应该检查他/她的电子邮件以获取“一次性密码”,然后键入一个文本框以继续。

生成和电子邮件发送已完成,但我不确定如何继续执行此操作

我的团队成员之间进行了一些讨论,其中一位提议使用会话超时,然后当单击按钮时,将发送电子邮件,将创建一个会话变量并在其中存储一次性密码,然后我们将引用用户使用会话变量输入的文本框文本,如果正确,他们将登录。

我想到的另一种方法是使用 Javascript 计时器,然后在网页上使用不可见的标签进行引用。但我不确定Javascript是否可以允许这种情况发生..

对于这种情况,您最好的方法是什么?

谢谢!