如何使用带有正确标题和SHA512哈希令牌的Node生成正确的TOTP?

ThisIsNotAnId

我最近被分配的一个学校项目有一个编码挑战,我们必须完成。挑战包括多个部分,最后一部分是上传到私有GitHub存储库,并在一定条件下通过发出POST请求来提交完成请求。

我已经成功完成了挑战的其他部分,并且坚持提交请求。提交内容必须遵循以下规则:

建立您的解决方案要求

首先,构造一个JSON字符串,如下所示:

{

    "github_url": "https://github.com/YOUR_ACCOUNT/GITHUB_REPOSITORY",

    "contact_email": "YOUR_EMAIL"

}

在中填写YOUR_EMAIL您的解决方案的电子邮件地址和私有Github存储库YOUR_ACCOUNT/GITHUB_REPOSITORY然后,以JSON字符串作为主体部分,对以下URL发出HTTP POST请求。

CHALLENGE_URL

内容类型

请求的Content-Type:必须为application/json

授权书

该URL受HTTP基本认证的保护,这在RFC2617的第2章中进行了说明,因此您必须在POST请求中提供Authorization:标头字段。

  • 对于HTTP基本身份验证的用户ID,请使用您在JSON字符串中输入的相同电子邮件地址。
  • 对于密码,请提供一个符合RFC6238 TOTP的10位基于时间的一次性密码。

授权密码

要生成TOTP密码,您将需要使用以下设置:

  • 您必须根据RFC6238生成正确的TOTP密码
  • TOTPTime Step X是30秒。T0是0。
  • 使用HMAC-SHA-512散列函数,而不是默认的HMAC-SHA-1
  • 令牌共享密钥是用户ID,后跟ASCII字符串值"APICHALLENGE"(不包括双引号)。

共享的秘密例子

例如,如果userid为"[email protected]",则令牌共享密钥为"[email protected]"(不带引号)。

如果您的POST请求成功,则服务器返回HTTP状态代码200。

我试图非常仔细地遵循此大纲,并以不同的方式测试我的工作。但是,看来我做不到。我们应该从节点服务器后端发出请求。到目前为止,这是我所做的。我使用以下代码创建了一个新的npm项目npm init并安装了相关性,您将在下面的代码中看到这些相关性:

const axios = require('axios');
const base64 = require('base-64');
const utf8 = require('utf8');

const { totp } = require('otplib');


const reqJSON = 
{
    github_url: GITHUB_URL,
    contact_email: MY_EMAIL
}
const stringData = JSON.stringify(reqJSON);

const URL = CHALLENGE_URL;
const sharedSecret = reqJSON.contact_email + "APICHALLENGE";

totp.options = { digits: 10, algorithm: "sha512" }

const myTotp = totp.generate(sharedSecret);
const isValid = totp.check(myTotp, sharedSecret);

console.log("Token Info:", {myTotp, isValid});




const authStringUTF = reqJSON.contact_email + ":" + myTotp;
const bytes = utf8.encode(authStringUTF);
const encoded = base64.encode(bytes);



const createReq = async () =>
{

    try 
    {

        // set the headers
        const config = {
            headers: {
                'Content-Type': 'application/json',
                "Authorization": "Basic " + encoded
            }
        };

        console.log("Making req", {URL, reqJSON, config});

        const res = await axios.post(URL, stringData, config);
        console.log(res.data);
    }
    catch (err)
    {
        console.error(err.response.data);
    }
};

createReq();

据我了解,我不确定自己在哪里犯错。在理解要求时,我尝试要非常小心。我已经简要研究了挑战概述的所有文档,并收集了在给定条件下正确生成TOTP所需的必要要求。

我发现npm包otplib可以通过传入的选项满足这些要求。

但是,我的解决方案不正确。当我尝试提交解决方案时,出现错误消息"Invalid token, wrong code"有人可以帮我看看我在做什么错吗?

我真的不希望我所有的辛苦工作都花光,因为这是一个漫长的项目。

提前非常感谢您的时间和帮助。我很感激。

做人

软件包的自述文件otplib指出:

// TOTP defaults
{
  // ...includes all HOTP defaults
  createHmacKey: totpCreateHmacKey,
  epoch: Date.now(),
  step: 30,
  window: 0,
}

所以默认值epoch (T0)就是Date.now()它是RFC标准。任务描述定义T00

您需要更改的默认值epoch0

totp.options = { digits: 10, algorithm: "sha512", epoch: 0 }

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

在PHP中使用SHA512正确使用crypt()

来自分类Dev

Laravel - 使用 SHA512 的哈希输入

来自分类Dev

“腌制”时,SHA512哈希提供不正确的(?)结果

来自分类Dev

尝试在C#和Node.js加密之间匹配SHA512哈希

来自分类Dev

Xamarin的Sha512哈希

来自分类Dev

在Go中生成crypt()sha512哈希

来自分类Dev

SHA512 哈希与消息和秘密 Google 表格

来自分类Dev

如何在C中打印SHA512哈希

来自分类Dev

在Swift中使用SHA512哈希字符串

来自分类Dev

使用带有未签名字符的SHA512 OpenSSL获取警告

来自分类Dev

同时转换为SHA512哈希

来自分类Dev

SHA512计算哈希返回乱码

来自分类Dev

PHP Sha512哈希是否足够?

来自分类Dev

快速解密SHA512哈希

来自分类Dev

我对Salting和SHA-512哈希密码的实现是否正确/安全?

来自分类Dev

如何使用Node.js验证Symfony2 sha512密码

来自分类Dev

如何使用Node.js验证Symfony2 sha512密码

来自分类Dev

如何使用带有express和EJS的node.js正确“包含” EJS文件

来自分类Dev

python中的sha512哈希不等于php中的sha512哈希

来自分类Dev

验证.NET中Python Passlib生成的PBKDF2 SHA512哈希

来自分类Dev

验证.NET中Python Passlib生成的PBKDF2 SHA512哈希

来自分类Dev

如何正确使用哈希?

来自分类Dev

如何在命令行上创建SHA512密码哈希

来自分类Dev

sha512 如何创建大于它提供的字符串的哈希?

来自分类Dev

C#-是否可以使用RSA SHA512签名哈希?

来自分类Dev

C#-是否可以使用RSA SHA512签名哈希?

来自分类Dev

SHA512的哈希字符串的长度是多少?

来自分类Dev

在 C# 中验证 SHA512 哈希密码

来自分类Dev

我的朋友使用不带盐的SHA512算法对密码进行哈希处理。我如何说服他他需要加盐?

Related 相关文章

热门标签

归档