- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个大量使用密码学的应用程序。与大多数网络应用程序一样,我的应用程序将数据分解为不同类型的消息(即时消息、文件 block 、视频帧等)——并且必须检查每个消息的真实性,以防篡改和正确的来源。到目前为止,我能够使用 ECDH 来协商我已经用于 AES 的共享 key 。当然,以后可以使用相同的共享 key 。
我的问题是:在这种情况下,使用 ECDSA 来签署每条消息,而不是简单地使用 ECDH 与 HMAC 建立的共享 key ,是否有任何额外的好处?
下面,当我说 M 时,我指的是加密消息或明文;没关系。请更正以下任何错误。
我知道在 ECDSA(或 DSA)中,通常使用安全散列算法(我目前正在使用其中一个 SHA-2)对消息(M
)进行散列处理以生成 H(M)
。 , 然后加密 H(M)
使用签名者的私钥。这会产生 R
和 S
整数(签名)。然后,M、R 和 S 被发送给已经拥有发送者公钥的接收者。 H'(M)
计算,并使用 R
验证签名和 S
. BouncyCaSTLe 提供 ECDSASigner
它实现了这一点。
在 HMAC 中,我需要一个共享 key 。然后:HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
(感谢 Paŭlo Ebermann 的更正。有关详细信息,请参阅他的答案。)
那么,考虑到 DH/ECDH 安全地协商共享 key ,我是否有理由不使用 HMAC?
相关:为什么 NSA为 DSA 而不是 MAC 指定标准算法?仅仅因为它可以是 SHA-2 + AES?
速度在这里很重要,因为我希望我正在制作的这个协议(protocol)不仅现在支持文本消息,而且在不久的将来也支持大文件和视频帧。因此,我更喜欢使用 HMAC,但想确保我能达到上述目标。
谢谢你的帮助!
最佳答案
DSA 的一个缺点是您的签名需要相当多的随机字节。甚至在使用错误的随机源的情况下,您的私钥也可以从签名中重建。对于 MAC,您必须签署大量消息,因此您需要大量随机数。如果您没有生产这些的硬件,您将耗尽熵。
HMAC 不需要任何随机数(它是确定性的)。
此外,我认为 HMAC 将比在这里使用 DSA 更有效,但您可以(并且应该)衡量这一点。
关于“更正错误”:您对 HMAC 的描述不太正确 - 没有“解密”。它更像是这样的:
您有消息M
, 散列函数 H
, 和一个共享 secret K
.添加两个公共(public)函数f1
和 f2
(这些是一些简单的 XOR+填充)。然后
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
与
||
是简单的串联。发送者和接收者做同样的计算,发送者将他的与消息一起发送,然后接收者将他的结果与发送的结果进行比较。 (确保以不允许定时攻击的方式进行比较,即比较所有内容,即使您已经发现它不匹配。)
Related: why does the NSA specify a standard algorithm for DSA and not MAC?
关于security - 数字签名与 HMAC 与通过 DH 的 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5683215/
我正在尝试在 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
我是一名优秀的程序员,十分优秀!