0

我正在编写一个 pam 模块,它使用一次性密码进行身份验证。我开始使用 sha512 作为 hmac 的算法编写它,但遇到了一个问题。我也用 sha1 做到了,这很有效。代码位于:https ://github.com/Ongy/pam_totp

我用sha512测试了hmac,据我所知这是正确的,所以错误应该在get_truncate函数中,它适用于sha1,但不适用于sha512。

static int get_truncate(const uint8_t * hash, size_t len, char * buffer,
        size_t maxlen)
{
    uint32_t value;
    uint8_t offset;
    offset = hash[len-1] & 0x0F;
    value = *((uint32_t *) (hash+offset));
    value = be32toh(value) & 0x7FFFFFFF;
    value %= 100000000;

    return snprintf(buffer, maxlen, "%08d", value);
}

这被称为

static int get_totp_sha512(const uint8_t * hashdata, size_t len, uint64_t time,
            char * dst, size_t maxlen)
{
    uint8_t buffer[64];
    uint64_t counter = htobe64(time);

    memset(buffer, 0, sizeof(buffer));

    calculate_hmac_sha512(hashdata, len, (uint8_t *) &counter,
                     sizeof(counter), buffer, sizeof(buffer));

    return get_truncate(buffer, sizeof(buffer), dst, maxlen);
}

大部分相关代码应该在 src/main.c 中。

rfcs 相关的是:62384226。(第二个描述的是通用算法,第一个也允许除sha1之外的其他哈希)

4

1 回答 1

0

好的,所以我必须修复的是我的测试用例,我使用了https://www.rfc-editor.org/rfc/rfc6238#appendix-B中给出的测试向量。我必须改变的:

关键实际上不是"12345678901234567890"sha512 而是"1234567890123456789012345678901234567890123456789012345678901234".

于 2015-05-27T06:35:33.483 回答