如何生成一次性密码(OTP / HOTP)?

2024-02-23

我们决定通过为客户发布 iPhone、Android 和 Blackberry 应用程序的方式开始进行多重身份验证。

Think 的一次性密码系统。

我知道如何生成一个独特的string通过使用基于帐户密钥加上设备序列号(或其他唯一标识符)的 SALT 进行散列。

但是有人知道如何像谷歌那样生成一个独特的、简短的数字吗?和/或有人有关于实现此类事情的文章的良好链接吗?

非常感谢


最后我发现这在RFC 4226 https://www.rfc-editor.org/rfc/rfc4226关于整数转换,可以使用按位运算来完成见第 7 页 https://www.rfc-editor.org/rfc/rfc4226#page-7,本质上它与下面答案中所示的相同。

stackoverflow 上的另一篇文章 https://stackoverflow.com/questions/4308003/hmac-based-one-time-password-in-c-rfc-4226-hotp关于 C# 上下文中的这一点,如果您处于类似的位置,这可能值得一读。

在 C# 中,我基本上对时间标识符进行了哈希处理(即当前时间(以秒为单位)除以 30 - 得到对当前 30 秒间隔有效的 long)。然后使用我的密钥作为 SALT 对其进行哈希处理。

进而...

// Use a bitwise operation to get a representative binary code from the hash
// Refer section 5.4 at https://www.rfc-editor.org/rfc/rfc4226#page-7            
int offset = hashBytes[19] & 0xf;
int binaryCode = (hashBytes[offset] & 0x7f) << 24
    | (hashBytes[offset + 1] & 0xff) << 16
    | (hashBytes[offset + 2] & 0xff) << 8
    | (hashBytes[offset + 3] & 0xff);

// Generate the OTP using the binary code. As per RFC 4426 [link above] "Implementations MUST extract a 6-digit code at a minimum 
// and possibly 7 and 8-digit code"
int otp = binaryCode % (int)Math.Pow(10, 6); // where 6 is the password length

return otp.ToString().PadLeft(6, '0');

对于那些不知道的人来说,Google Authenticator 是一个开源项目 - 您可以在这里浏览源代码 http://code.google.com/p/google-authenticator/source/browse/?repo=android.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何生成一次性密码(OTP / HOTP)? 的相关文章

随机推荐

  • WASAPI:以最小延迟播放正弦波声音,无毛刺(独占事件驱动模式)

    我尝试在独占模式下使用 Windows 音频会话 API WASAPI 播放简单的正弦波形 但无论我做什么 都会遇到声音故障 我一直在使用MSDN 独占模式流示例 https msdn microsoft com en us library
  • Android:java.lang.IllegalArgumentException:服务未注册

    我有活动 启动服务并绑定它 但我希望即使活动关闭我的服务也能运行 所以我需要取消绑定它 当我尝试这样做 调用我的函数disconnectFromService 时 我总是遇到此异常 服务绑定成功 可以正常通信了 仅当服务已绑定时 我才尝试解
  • 使用 Google Sheets/Google Drive API 请求特定文件权限

    我正在使用 Google Sheets API 获取 Java 项目的工作表数据 一切都在本地按预期工作 但我使用的是详细权限范围https www googleapis com auth spreadsheets https www go
  • 常量表达式中具有未初始化成员的“默认”构造函数

    以下最小示例因未初始化数组数据成员而被 Clang 和 GCC 拒绝 class vector3 public constexpr vector3 default private float m data 3 constexpr auto
  • 带有超链接的 Pandas read_excel

    我有一个 Excel 电子表格 正在将其读入 Pandas DataFrame df pd read excel file xls 但是 电子表格的其中一列包含具有与其关联的超链接的文本 如何访问 Pandas 中的底层超链接 这可以用 o
  • 自定义 UITableViewCell 内的水平 UIScrollView - 使用 IB Storyboard - 不滚动

    主要目标是能够水平滚动每行的内容 我正在尝试使用 X Code 5 和 StoryBoard 来做到这一点 问题似乎很简单 但是经过几个小时的搜索 除了一个有点相似但仅使用编程方法的问题之外 我什么也没得到 see here https s
  • Android 动画时删除视图错误

    private void kartyafeleanim String idx1 String idx2 Animation anim1 AnimationUtils loadAnimation mycontext R anim scalab
  • Oracle数据库:如何选择所有列但首先返回某些列?

    背景 我有一个 Oracle 数据库表 其中有很多列 我正在对这些列运行一些查询 我不知道我在查询中到底要查找什么数据 所以我想返回所有列 但我不想寻找和啄食我知道有意义的列 Question 假设有一个表 表 1 A 列 B 列 C 列
  • 将菜单按钮添加到 VS2010 TFS 查询结果或工作项栏中

    我正在尝试将按钮添加到 Visual Studio TFS2010 工作项查询结果菜单栏以及为各个工作项显示的菜单栏 见下图 这实际上是可定制的且可行的吗 如果可以 如何实现 我会看一下这篇文章 TFS 2010 将菜单项添加到构建资源管理
  • 从浏览器检测Windows 10

    我需要在客户端运行 Windows 10 S 特别是 S 仅 Win 10 还不够 时将浏览器重定向到特定页面 用户代理似乎没有指定这一点 我已经找到了在客户端上通过 C 和 WMI 获取此数据的解决方案 但我需要在网页上运行 Javasc
  • MvvmLight EventToCommand 和 WPFToolkit DataGrid 双击

    试图弄清楚如何使用 EventToCommand 为行设置数据网格双击处理程序 该命令位于每行的视图模型中 只是that很大程度上来自我的经验 因为我还没有使用过交互 Thanks 我本来会使用 mvvmlight 标签 但我还没有足够高的
  • 如何使用 Kotlin DSL 创建 Fat JAR?

    我正在使用 Gradle 5 5 我有一个基于 Groovy 的构建脚本 我正在尝试将其迁移到 Kotlin DSL 这jar任务包含将所有依赖项复制到 JAR 文件的典型行 from configurations compile coll
  • 打开键盘时隐藏页脚 ionic4

    参考了这个链接 在键盘打开 Ionic3 上隐藏页脚 https stackoverflow com questions 48386422 hide footer on keyboard open ionic3 但问题也是一样的 问题与上图
  • 如何使用 OSGi 和 EE6 模块化企业应用程序?

    我知道已经有一些与该主题相关的问题 但我还找不到真正的解决方案 目前我正在使用 EE6 JPA CDI JSF 开发应用程序 我想采用一种更加模块化的方法 而不是将所有内容打包到 WAR 或 EAR 中并将整个内容部署在应用程序服务器上 我
  • WooCommerce 在产品标题中显示产品类别

    我有一个运行 WooCommerce 版本 2 3 8 的 Wordpress 版本 4 2 2 电子商务网站 在我的个人产品页面上 我希望将产品的标题设置为还包括我在 WooCommerce 中创建的以及该产品所属的自定义类别 我找到与单
  • 项目贡献者的 github graphql 查询

    我想使用 GitHub Graphql api 查询项目贡献者 有人能给我任何提示吗 刚刚尝试了一段时间 我想我错过了一些小元素 我想要得到某样东西https api github com repos facebook react cont
  • 核心数据图像不会加载到 NSTableView 图像单元中

    在我的代码中 我将图像存储到我的核心数据模型中 工作正常 如果我将视图设置为具有 NSImageView 并将其数据绑定到 Controller Key selection 和 modelKeyPath myImagePath 则它可以工作
  • 如何通过htaccess在URL中添加index.php

    实际上我需要通过 htaccess 文件在我的应用程序 URL 中添加 index php 我的网址是这样的 http localhost 8080 myapp xyz abs html 我需要将其更改为 http localhost 80
  • 在 PHP 中检索相对 DOM 节点

    我想检索文档中下一个元素标签的数据 例如 我想找回 blockquote Content 1 blockquote 仅适用于每个不同的跨度 span span blockquote Content 1 blockquote blockquo
  • 如何生成一次性密码(OTP / HOTP)?

    我们决定通过为客户发布 iPhone Android 和 Blackberry 应用程序的方式开始进行多重身份验证 Think 的一次性密码系统 我知道如何生成一个独特的string通过使用基于帐户密钥加上设备序列号 或其他唯一标识符 的