gpt4 book ai didi

c++ - HMAC-SHA1 Crypto++实现中如何使用自定义 key

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:26 25 4
gpt4 key购买 nike

我想在我的 C++ 项目中实现 OAuth 1.0 协议(protocol)。为了创建 OAuth 签名,我需要实现 HMAC-SHA1 算法,其中 keytext 将是根据 OAuth 规范创建的一些字符串。

我想使用 Crypto++ 库来实现 HMAC-SHA1。我在项目的 wiki 上找到了这个 HMAC-SHA1 示例:

AutoSeededRandomPool prng;

SecByteBlock key(16);
prng.GenerateBlock(key, key.size());

string plain = "HMAC Test";
string mac, encoded;

/*********************************\
\*********************************/

// Pretty print key
encoded.clear();
StringSource(key, key.size(), true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource

cout << "key: " << encoded << endl;
cout << "plain text: " << plain << endl;

/*********************************\
\*********************************/

try
{
HMAC< SHA256 > hmac(key, key.size());

StringSource(plain, true,
new HashFilter(hmac,
new StringSink(mac)
) // HashFilter
); // StringSource
}
catch(const CryptoPP::Exception& e)
{
cerr << e.what() << endl;
exit(1);
}

/*********************************\
\*********************************/

// Pretty print
encoded.clear();
StringSource(mac, true,
new HexEncoder(
new StringSink(encoded)
) // HexEncoder
); // StringSource

cout << "hmac: " << encoded << endl;

但我无法理解如何使用我创建的 key 而不是随机生成的字符串。我试过只创建:

string key=...; //string generated by OAuth specification;

但随后出现编译错误。但是当我写的时候:

string plain=...; //string generated by OAuth specification;

那么就没有错误了。

我需要指定什么 key 长度?因为我会有不同长度的 key (有 48 个和可能 96 个符号)。

最佳答案

看来您需要熟悉一些事项。 (抱歉,我帮不上忙,因为我从来没有这样做过)。

首先是安全架构。您可以在 Beginner's Guide to OAuth – Part III : Security Architecture 找到一些阅读 Material .

其次是 HMAC-SHA1 签名和格式。您可以在 OAuth Core HMAC-SHA1 找到概述.

第三,你需要了解OAuth的编码和呈现格式。您可以在 OAuth Core Parameter Encoding 找到一些阅读 Material .


回答您的一些问题:

您需要解析和解码参数以获得 key 、签名数据和签名。因此,您需要解析和解码三个值:oauth_keyoauth_dataoauth_signature

然后,您将按如下方式设置您的 Crypto++ HMAC key

SecByteBlock key(SHA1::BLOCKSIZE);
memcpy(key.data(), key.size(), oauth_key);

之后,您将使用以下内容进行验证:

byte oauth_key[] = ...; // Your parsed and decoded key
string oauth_data = ...; // Your parsed and decoded data
string oauth_signature = ...; // // Your parsed and decoded signature

try
{
SecByteBlock key(SHA1::BLOCKSIZE);
memcpy(key.data(), key.size(), oauth_key);

HMAC< SHA1 > hmac(key, key.size());
const int flags = HashVerificationFilter::THROW_EXCEPTION | HashVerificationFilter::HASH_AT_END;

StringSource ss(oauth_data + oauth_signature + mac, true,
new HashVerificationFilter(hmac, NULL, flags)
); // StringSource

cout << "Verified message" << endl;
}
catch(const CryptoPP::Exception& e)
{
// Handle failure
cerr << e.what() << endl;
}

Crypto++ 可能能够提供帮助的另一件事是 Base64 解码。以下来自HexDecoder wiki page ,但它适用于 Base64Decoder,因为编码器和解码器使用相同的接口(interface)。

string encoded = ...;
string decoded;

StringSource ss(encoded,
new HexDecoder(
new StringSink(decoded)
) // HexDecoder
); // StringSource

所以你的代码是:

string encoded = ...;
string decoded;

StringSource ss(encoded,
new Base64Decoder(
new StringSink(decoded)
) // Base64Decoder
); // StringSource

上面使用了 Crypto++ 的管道接口(interface),其中数据从源流向接收器。您还可以在 Base64Decoder 对象上使用 PutGet 以更像“C”的方式执行此操作:

string encoded = ...;
string decoded;

Base64Decoder decoder;

decoder.Put( (byte*)encoded.data(), encoded.size() );
decoder.MessageEnd();

word64 size = decoder.MaxRetrievable();
if(size && size <= SIZE_MAX)
{
decoded.resize(size);
decoder.Get((byte*)decoded.data(), decoded.size());
}

关于c++ - HMAC-SHA1 Crypto++实现中如何使用自定义 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19301100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com