问题标签 [hmac]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
security - AES256 CBC + HMAC SHA256 确保机密性*和*身份验证?
我正在考虑使用 AES256 CBC + HMAC SHA-256 作为确保机密性和身份验证的消息的构建块。
特别是,考虑这种情况:
- Alice 拥有属于 Bob 的公钥(密钥交换和算法超出了本问题的范围)。Alice 有一个识别密钥 K,也与 Bob 共享,她可以用它来识别自己。只有 Alice 和 Bob 知道密钥 K。
- Alice 使用 Bob 的公钥加密 (nonce || K)。
- Bob 解密数据包,现在有 K 和 nonce。
- Bob 使用 SHA-256 和 SHA256(K || nonce) 来产生 256 位的 K(e)。
- Bob 使用 SHA-256 和 SHA256(K || nonce + 1) 来产生 256 位的 K(s)。
现在对于 Bob 希望发送给 Alice 的每个数据包,他执行以下操作:
- 创建一个新的随机 128 位 IV
- 使用 IV 和 K(e) 作为密钥加密消息。
- 创建一个 SHA-256 HMAC,其中 K(s) 作为密钥,(IV || Encrypted message) 作为数据。
- 最后将 (IV || HMAC || Ciphertext) 发送给 Alice
Alice 还计算了 K(e) 和 K(s),并在接收 Bob 的数据时遵循以下过程:
- 将消息拆分为 IV、密文和 HMAC。
- 使用 K(s)、IV 和密文计算 HMAC。
- 将 HMAC 与发送的 HMAC 进行比较。如果匹配,Alice 认为这个消息被认证为 Bob 发送的消息,否则被丢弃。
- Alice 使用 K(e) 解密消息
这个协议是否确保 Alice 只解密来自 Bob 的消息,假设除了 Bob 之外没有人可以读取 Alice 发送给他的使用他的公钥加密的加密消息?
即以这种方式构建的消息是否确保机密性和身份验证?
注意:如果协议要求 Bob 发送多条消息,该方案需要稍作修改以避免重放攻击。
PS 我知道 AES-GCM/CCM,但这个方案适用于大多数加密包中的基本 AES、SHA 和 HMAC 算法。这个解决方案也可能会更慢,但这也超出了问题的范围。
security - 使用 HMAC-SHA1 进行 API 身份验证 - 如何安全地存储客户端密码?
在使用S3 样式身份验证的 RESTful API 中,API 客户端使用 HMAC-SHA1 使用其密钥对请求进行签名,因此密钥永远不会通过线路传输。然后,服务器通过使用客户端的密钥来验证客户端,以重复签名过程本身并将结果与客户端传输的签名进行比较。
这一切都很好,但这意味着服务器需要访问客户端共享密钥的明文。这违背了所有反对在数据库中明文存储用户密码的建议。据我所知,仅存储密码的加盐哈希不是一种选择-因为那样我就无法验证客户端的签名。
我应该强调我的 API 是 RESTful 的,因此应该是无状态的:我宁愿在其他 API 调用之前避免登录步骤。
一种可选的解决方案是使用某种对称密钥算法加密所有用户密码。但是,服务器必须将加密的密钥存储在易于访问的地方,例如源代码内部。这总比没有好,但不是最佳解决方案(正如@Rook 在他的回答中提到的,它违反了 CWE-257)。
解决方案的另一个方向可能是围绕非对称签名,但我不知道如何将其应用于 HMAC,也找不到任何关于该主题的文章。
我在这里遗漏了一些明显的东西吗?许多受人尊敬的提供商已经实施了这种身份验证方案——他们不可能都违反共同的安全原则,不是吗?如果没有,您是否可以分享任何最佳实践?
php - 如何正确实现 hash_hmac?
阅读这个关于密码散列的优秀答案并想知道如何实现它:
邪恶的跳蚤写道:
为每个用户生成一个随机数;仅此一项就击败了彩虹桌。这是一个随机数,根据范围,它会扩展产生的哈希值的数量。
那么除了用户密码之外,在我的数据库中存储一个唯一的令牌吗?
原帖中的示例代码:
如何使用此代码验证密码?让我解释:
当用户提交他的密码时,我需要生成它的哈希来检查电子邮件地址和哈希密码匹配的现有数据库行。当我对用户一无所知时,如何选择这一行$nonce
?我错过了什么吗?也许我只需要通过他的电子邮件地址选择用户,然后稍后验证密码哈希?
顺便说一句,你推荐这种散列方法吗?
amazon-simpledb - 计算 HMAC-SHA 签名
我正在为亚马逊的 SimpleDB 编写一个模块。他们要求使用 HMAC-SHA 算法对 REST 请求进行签名。(这里有详细信息。)
我被告知有一个计算这个签名的功能,但我在文档中找不到它。调用的函数是什么,它的参数是什么样的?
security - 数字签名与 HMAC 与通过 DH 的密钥
我正在编写一个大量使用密码学的应用程序。与大多数网络应用程序一样,我的应用程序将数据分解为不同类型的消息(即时消息、文件块、视频帧等)——并且必须检查每个消息的真实性,以防篡改和正确的来源。到目前为止,我可以使用 ECDH 来协商我已经用于 AES 的共享密钥。当然,以后可以使用相同的共享密钥。
我的问题是:在这种情况下,使用 ECDSA 来签署每条消息,而不是简单地使用 ECDH 与 HMAC 建立的共享密钥,是否有任何额外的好处?
下面,当我说 M 时,我指的是加密消息或明文;没关系。请更正以下任何错误。
我知道在 ECDSA(或 DSA)中,通常M
使用安全散列算法(我目前正在使用 SHA-2 之一)对消息()进行散列H(M)
,然后H(M)
使用签名者的私钥对消息进行加密。这会产生R
和S
整数(签名)。然后,M、R 和 S 被发送给已经拥有发送者公钥的接收者。 H'(M)
计算,并使用R
和验证签名S
。BouncyCastle 提供了ECDSASigner
实现这一点的方法。
在 HMAC 中,我需要一个共享密钥。然后:(
HMAC(K, M) := H( f2(K) || H(f1(K) || M) )
感谢 Paŭlo Ebermann 的更正。有关详细信息,请参阅他的答案。)
那么,考虑到 DH/ECDH 安全地协商共享密钥,我是否有理由不使用 HMAC?
相关:为什么NSA为 DSA 而不是 MAC 指定标准算法?仅仅因为它可以是 SHA-2 + AES?
速度在这里很重要,因为我希望我正在制作的这个协议不仅现在支持文本消息,而且在不久的将来也支持大文件和视频帧。因此,我更喜欢使用 HMAC,但想确保我能达到上述目标。
谢谢你的帮助!
iphone - php 到 iphone 代码 - CCHmac kCCHmacAlgSHA256
我正在尝试使用 hmac sha256 加密登录到我的服务器,我在 php 中有工作代码,但无法让它在 iphone 中工作并追踪到 iphone 中的 hmac 对 php 代码产生不同的输出,给定相同的输入 php代码是
目标c代码是
perl - Perl 代码为 HMAC SHA256 签名生成密钥?
我计划使用类似于Amazon AWS 示例的代码来验证签名的 API 请求。所以用户会有类似的东西:
$digest
并作为参数附加到他们的请求 URI。服务器端将使用相同的算法从客户端 URI 创建摘要,并将其与客户端发送的值进行比较。
我找不到的是Perl支持生成正确长度的 SecretKey 以在生成 HMAC SHA256 摘要时使用。
对于我的 Amazon AWS 账户,我得到了一个 40 ASCII 字符的 base64 编码字符串。
如何为我的客户生成正确的密钥?
perl - Perl Data::UUID 是强对称密钥源吗?
我正在考虑使用 Data::UUID Perl 模块生成一个 256 位对称密钥,用于 HMAC_SHA256 算法。每个调用都应该给我一个唯一的 128 位字符串,所以我正在考虑执行以下操作:
use Data::UUID;
my $ug = new Data::UUID;
my $uuid1 = $ug->to_hexstring($ug->create());
my $uuid2 = $ug->to_hexstring($ug->create());
my $256_bit_key = $uuid1 . $uuid2;
这个密钥在密码学上是否强大?
security - hmac 密钥和盐长度
我正在使用 hmac sha1 对传递给第三方服务的用户 ID 进行签名。所有用户都使用相同的秘密,并且每个用户的盐都是唯一的。
hmac 是否适用于短字符串?userid:timestamp 可以是例如 12:1304985212 盐和秘密的顺序重要吗?(salt+secret vs secret+salt) 共享密钥长度应该是多少,盐长度应该是多少?我可以使用相同的秘密来签署服务器和远程服务之间的消息,还是生成单独的秘密更好?
谢谢
java - 用于在 Android 上生成 HMAC-SHA1 OAuth 签名的库?
使用下面的规范,我需要在 Android 上创建一个 oauth_signature。我正在寻找一个库来处理样板代码,以创建通过 OAuth 访问资源的签名。
构造一个签名“基本字符串”,它由三个请求元素的串联组成:
- HTTP 请求方法。
- 请求发送到的基本 URL。此 URL 不应包含任何查询参数。签署对 Google 服务的调用时,请参阅 OAuth 规范的第 9.1.2 节以获取相关说明。
- 请求中参数的规范化字符串(不包括 oauth_signature 参数)。这包括在请求标头或正文中发送的参数,以及添加到请求 URL 的查询参数。要规范化字符串,请使用字典字节值排序对参数进行排序。有关规范化此字符串的更多详细信息,请参阅 OAuth 规范的第 9.1.1 节。
使用以下序列之一生成 oauth_signature:
- 如果您的应用程序已注册并且您正在使用 HMAC-SHA1,请使用注册期间生成的 OAuth“消费者机密”值;此值显示在您域的注册页面上。