【问题标题】:problem in implementing google authenticator app in c++在 C++ 中实现谷歌身份验证器应用程序的问题
【发布时间】:2021-08-08 14:22:12
【问题描述】:

我正在尝试在 C++ 中实现 google Authenticator 机制。 我总是得到与谷歌身份验证器不同的 OTP。

不知道为什么?

1 - 我搜索并发现谷歌使用 HMAC-SHA1 算法。但我很怀疑,因为:

  • 我读过的几乎所有文章都是旧的。似乎无关紧要。
  • 我发现谷歌身份验证器代码现在是私有的 开源。所以恐怕谷歌可能会改变使用的算法
  • 我发现 SHA1 不再安全。有些人设法使 SHA1 冲突。如果谷歌仍然使用它而不是 其他更安全的算法,例如 SHA256、SHA512。

如果您有任何相关信息,请告诉我。

2 - 我确定我的代码是正确的。

代码如下:

/*****************************************************************************************/
#include <iostream>
#include <cmath>
#include <ctime>
#include <stdio.h>
#include <string>
#include "SHA1.h"
#include "HMAC_SHA1.h"

using namespace std;

void IntegerToString(time_t epochTime, BYTE timeAsString[] , int length);
int TimeLength(time_t epochTime);

int main(void)
{
    CHMAC_SHA1 sha1;
    int one,two,three,four;
    time_t result = time(nullptr);
    result = (long long)floor(result/30);
    cout << result <<endl;

    int offset;
    int truncatedHash;
    int finalOTP;

    BYTE key[33] = "atoqb4y572clkhj2sls5h72a76cnyzpe";
    int key_len = 33; /*32 + null terminator*/

    int text_len = TimeLength(result);
    //cout << text_len << endl;
    BYTE text[text_len+1];
    IntegerToString(result , text , text_len);
    text[text_len] = '\0';

    //printf("%s",text);

    /*the digest is always 20 bytes long*/
    BYTE digest[20] = {0};

    sha1.HMAC_SHA1(text,text_len,key,key_len-1,digest);

    printf("0x");
    for(int i = 0 ; i < 20 ; i++)
    {
        printf("%x",(int)digest[i]);
    }

        offset = digest[19] & 0xf;
    
        one   = (digest[offset+0] & 0x7f) << 24;
        two   = (digest[offset+1] & 0xff) << 16;
        three = (digest[offset+2] & 0xff) << 8;
        four  = (digest[offset+3] & 0xff);
        truncatedHash = one | two | three | four;
        finalOTP = (truncatedHash % (1000000));

        cout << "\nyour OTP : " << finalOTP << endl;
    return 0;
}

void IntegerToString(time_t epochTime, BYTE timeAsString[] , int length)
{
    time_t reverse = 1; /*to hold zeros*/
    int i = 0;

    while(epochTime >= 1) /*reverse : 1000 -> 10001*/
    {
        reverse = reverse*10+epochTime%10;
        epochTime = epochTime / 10;
        //cout << epochTime << "*" << reverse <<endl;
    }

    while(reverse != 1)
    {
        timeAsString[i] = (reverse%10 +'0');
        reverse = reverse / 10;
        //cout << i << timeAsString[i] << "#" << reverse << endl;
        i++;
    }
}

int TimeLength(time_t epochTime)
{
    int counter = 0;

    while(epochTime)
    {
        epochTime = epochTime / 10;
        counter++;
    }

    return counter;
}

请帮忙。

【问题讨论】:

  • 这是一个编程问题,与Stack Overflow 相关。但是现在的问题是,它的质量太低而无法迁移。请edit您的问题更好地格式化。使用预览查看格式化是否按预期工作。
  • 现在很酷吗?如果有任何不明确的地方请问我。
  • 您阅读过相关标准RFC6238和RFC4226吗?
  • 是的,我做到了。 RFC4226 说谷歌使用 HMAC-SHA1。

标签: multi-factor-authentication sha hmac c++ totp


【解决方案1】:

您使用的密钥atoqb4y572clkhj2sls5h72a76cnyzpe 似乎不是hex 格式。 你应该使用十六进制(你的字符串的十六进制是04dd00f31dfe84b51d3a92e5d3ff40ff84dc65e4如果你需要使用base32,你需要先将其转换为hex

【讨论】:

    猜你喜欢
    • 2013-02-11
    • 1970-01-01
    • 1970-01-01
    • 2016-11-14
    • 2011-06-13
    • 1970-01-01
    • 2020-04-13
    • 2020-06-09
    • 1970-01-01
    相关资源
    最近更新 更多