- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想在我的 C++ 项目中实现 OAuth 1.0
协议(protocol)。为了创建 OAuth 签名,我需要实现 HMAC-SHA1
算法,其中 key
和 text
将是根据 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_key
、oauth_data
和 oauth_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
对象上使用 Put
和 Get
以更像“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/
我正在尝试在 Elixir 中编写亚马逊产品广告 API 客户端。开发者指南描述了 the process for signing an API request其中必须使用请求和“ secret 访问
我在AIX上运行脚本时遇到以下错误 Reading configuration data /ecmsq1vg1/home1/aradmin/.ssh/config Reading configurat
见 OpenSSL::HMAC documentation . 我正在尝试这个: require "openssl" puts OpenSSL::HMAC.hexdigest(:sha256, "se
我正在使用 https://github.com/DaGenix/rust-crypto并且有一些奇怪的错误: extern crate crypto; use crypto::sha2::{Sha2
我们有一个 python 网络服务。它需要一个散列作为参数。python中的hash就是这样生成的。 hashed_data = hmac.new("ant", "bat", hashlib.
这将是一个很长的问题,但我有一个非常奇怪的错误。我在 C++ 中使用 OpenSSL 来计算 HMAC,并将它们与使用 javax.crypto.Mac 的模拟实现进行比较。对于某些 key ,HMA
我在我的代码中发现了一个巨大的问题,我完全不知道是什么导致了这个问题。 所以,当我向我的服务器发送请求时,我对请求中的字符串进行哈希处理。这有时是用户输入。 我的应用是多语言的,所以我必须支持所有“ä
我想弄清楚为什么 openssl 中的 hmac 没有给我与 java 中的 hmac 相同的结果。 在开放的 ssl 中 echo -n "Hello" | openssl dgst -sha256
与: KEY='7vgd39eyxald9sucClM7' DATA='POST\nmultipart/form-data\nWed, 10 Jun 2015 07:27:43 GMT\n/1/cla
我正在尝试转换一个 secret 的 hmac 字符串,以允许我在 postman 中测试我的 api。 Postman 预装了 cryptojs。这是我在我的测试服务器上使用加密的过程: const
Security.Cryptography.HMACSHA256.Create() 和 Security.Cryptography.KeyedHashAlgorithm.Create("HmacSHA
图例 我公开了一个 API,它要求客户端通过发送两个 header 来签署请求: Authorization: MyCompany access_key: Unix-TimeStamp: 要创建签名
我在 Android 上遇到一些 HMAC 问题。我将 SHA1 算法与以下代码一起使用,在搜索 android hmac-sha1 时会在整个网络上显示。 String base_s
HS256 和 HS512 加密算法之间是否存在实际差异,或者与已经牢不可破的 key 相比,更长的 key 是否多余?我应该使用哪一个来加密 JWT token ? 是否有可能将 HS512 加密与
我需要使用 SHA512 加密的 cHMAC 我使用此方法获得的加密值和服务器端值不匹配他们使用 Java 的服务器端可以请帮助我解决这个问题。 服务器端加密值是 85d86c928825ef85d5
我从https://www.rfc-editor.org/rfc/rfc6238借用了HMAC-SHA1 Java代码并略微调整以对其进行硬编码,以使用具有已知输出的一对已知 key /消息。 然后我
我正在用 go 开发一个网络服务器, 在顶部我有 import ("net/http" "log" "fmt" "encoding/json" "encoding/he
使用 Node.js 加密模块时 const crypto = require('crypto'); HMACseed = crypto.createHmac('sha512', 'a55e3
我正在寻找用于密码加密的正确 Java 算法,我发现 Java SDK 提供了 PBKDF2WithHmacSHA1,但没有提供 PBKDF2WithHmacSHA256。 我听说 HMAC-SHA2
所以我一直在查看维基百科的 HMAC 伪代码,它看起来相对简单;如果您的 key 大小已经是块大小,则伪代码可归结为 3 行: o_key_pad ← key xor [0x5c * bloc
我是一名优秀的程序员,十分优秀!