【发布时间】:2017-09-05 20:02:42
【问题描述】:
我使用 AES 为 API 调用创建 HMAC 签名,虽然我了解什么是 nonce 以及它们为何重要,但我对它们的具体实现位置有点困惑。
我的想法是使用 nonce 来更改客户端的密钥,以生成一个新的一次性密钥来签署调用,否则这些调用很容易被重放攻击利用。
基本前提是用户在登录时获得一个密钥,调用一个设置 API 过程,该过程创建并返回一个 transactionID 和一个新的 nonce。然后,用户将自己的密钥和 nonce 结合起来,对 TransactionID 和其他一些东西进行签名。然后,服务器尝试使用该用户当前活动的随机数来匹配此签名。
当进行新的设置调用时,服务器会自动清除旧的随机数并覆盖它们,因此用户必须始终遵循这个配对顺序(你不能只重复第二次调用,因为旧的随机数将被删除,服务器将不再接受此签名)。
如果这是使用 nonce 的有效方式,我如何将它们与客户端的密钥结合以获得有效的密钥?
我以这种方式生成 AES 提供程序:
private static AesCryptoServiceProvider GetProvider(byte[] key, byte[] IV)
{
AesCryptoServiceProvider result = new AesCryptoServiceProvider();
result.BlockSize = 128;
result.KeySize = 256;
result.Mode = CipherMode.CBC;
result.Padding = PaddingMode.PKCS7;
result.IV = IV;
result.Key = key;
return result;
}
我使用 AES-256,所以我的密钥总是 32 字节长。但是,如果我想使用 nonce 创建一个新密钥,我不能简单地将它们连接起来,因为结果字符串将不再是 32 个字节。
我应该连接然后使用固定长度的哈希函数将结果恢复为 32 字节长度吗?或者是否有一个 AESCryptoServiceProvider 构造函数/方法可以自动处理我丢失的随机数? 还是我只是应该将纯文本的随机数附加到签名中,让服务器单独读取它们并直接检查它们?
【问题讨论】:
标签: c# security cryptography aes hmac