【问题标题】:How to Store Time-Based OTP Secret Key in MySQL如何在 MySQL 中存储基于时间的 OTP 密钥
【发布时间】:2019-04-23 06:10:17
【问题描述】:

几小时前我发布了这个:Is storing secret key as a plaintext in SQL a bad move?

我认为我的问题和总结不够清楚。我指的是基于时间的 OTP 的密钥,而不是常规密码。是的,我有 password_hash()-ed 密码,但没有密钥。 Authy 或 Google Authenticator 可以使用生成的密钥每 30 秒显示一次当前 OTP。除非你们告诉我也要散列我的密钥,否则我不明白为什么我的问题是重复的。

关于 Dat 的评论,我看不出 otplib(javascript 库)对我有什么帮助,因为我仍然需要一个不同的随机密钥来绑定不同的个人帐户,除非我对所有帐户都使用相同的密钥帐户。另外,我需要一种方法来记下哪些密钥链接到哪个帐户,因此它回到了我的主要问题,关于如何安全地存储密钥,以便每当帐户尝试使用 OTP 登录时,我都可以验证它。

对于给您带来的麻烦,我深表歉意,并提前感谢您。

【问题讨论】:

  • 我不知道您的身份验证工作流程,但是为什么您的 PHP 应用程序甚至需要存储 OTP?通常这将在服务器端生成并返回给调用者。没有必要存储它。
  • 我正在关注本教程:youtube.com/watch?v=t49zjBGD75U,稍作修改。另外,我不是在存储 OTP,而是在存储密钥。当密钥添加到谷歌身份验证器或 Authy 时,他们的密钥将每 30 秒显示 6 位 OTP。

标签: php mysql


【解决方案1】:

我了解您的问题。按照 otplib 说明,我认为这是您需要存储的内容

import crypto from 'crypto';

authenticator.options = { crypto };

// Or if you're using the other OTP methods
// hotp.options = { crypto }
// totp.options = { crypto }

const secret = 'KVKFKRCPNZQUYMLXOVYDSQKJKZDTSRLD' <--- This is what you need to store, right ?
const token = authenticator.generate(secret); // 556443

通常这个 secret 密钥由您的用户 ID + YOUR_PRIVATE_SECRET_KEY 生成

YOUR_PRIVATE_SECRET_KEY 是后端环境中的密钥注入

【讨论】:

    猜你喜欢
    • 2017-04-27
    • 2015-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-09
    • 2014-03-26
    • 2021-03-16
    相关资源
    最近更新 更多