问题标签 [message-digest]

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.

0 投票
4 回答
9767 浏览

c# - c# 快速哈希计算

我正在寻找原生 MD5 或 SHA1 库的 ac# 包装器,以提高哈希计算性能。

以前我将 SharpZipLib 切换到 zlib 并获得了 2 倍以上的性能提升。(好吧,你必须注意你有正确的 zlib.so 或 zlib.dll 取决于操作系统和硬件,但它有回报)。

MD5 或 SHA1 是否值得,或者 .NET 和 Mono 都已经依赖本机实现了?

(已编辑)另外:如果我必须坚持使用 MD5CryptoServiceProvider,有没有一种方法可以在我阅读文件时计算文件的哈希值?我的意思是,分块发送字节但仍然计算整个哈希?

0 投票
2 回答
208 浏览

md5 - 验证文件摘要

假设我有“n”个文件,每个文件都有 CRC32、MD5 和 SHA1 摘要

现在这些“n”个文件实际上是单个大文件的拆分文件/档案。

当这些较小的文件重新组合/加入到较大的文件中时,我们也可以计算这个较大文件的摘要。

我的问题是:有没有办法验证这些小文件的摘要组合是否等于大文件的摘要?

例如,假设我有一个文件分成 4 个部分,摘要为 0xDE、0xAD、0xBE、0xEF

说,加入后,较大的文件有摘要0xC0

有什么方法可以验证join(0xDE,0xAD,0xBE,0xEF)== 0xC0,其中'join'是我正在寻找的神奇操作/公式/算法?

0 投票
6 回答
3670 浏览

security - 什么时候使用损坏的哈希函数是安全的?

使用像 SHA-256 这样的安全散列函数是微不足道的,继续使用 MD5 来保证安全是鲁莽的行为。但是,我想更好地理解散列函数漏洞的一些复杂性。

为 MD4 和 MD5 生成碰撞。根据 NIST,MD5 不是一个安全的散列函数。只需要2 39 次操作就可以产生冲突,并且永远不应该用于密码。然而,SHA-1 容易受到类似的碰撞攻击,其中可以在 2 69次操作中发现碰撞,而蛮力是 2 80次。没有人产生 SHA-1 冲突,NIST 仍然将 SHA-1 列为安全消息摘要函数

那么什么时候使用损坏的哈希函数是安全的呢?即使一个功能被破坏,它仍然可以“足够大”。根据 Schneier的说法,易受碰撞攻击的哈希函数仍然可以用作HMAC。我相信这是因为 HMAC 的安全性取决于其密钥,并且在获得此密钥之前无法找到冲突。一旦你在 HMAC 中使用了密钥,它就已经被破坏了,所以这是一个有争议的问题。哪些哈希函数漏洞会破坏 HMAC 的安全性?

让我们更进一步地了解这个属性。如果在密码前加上盐,那么使用非常弱的消息摘要(如 MD4)作为密码是否会变得安全?请记住,MD4 和 MD5 攻击是前缀攻击,如果添加了盐,那么攻击者将无法控制消息的前缀。如果盐确实是一个秘密,并且攻击者不知道,那么是否将它附加到密码中是否重要?假设攻击者在获得整个消息之前无法产生冲突是否安全?

您是否知道可以在安全上下文中使用损坏的哈希函数而不引入漏洞的其他情况?

(请发布支持证据,因为它太棒了!)

0 投票
6 回答
1680 浏览

java - 在java中为字符串构造一个唯一的数字

我们需要将超过 1000 万个字符串读/写到一个文件中。此外,我们不希望文件中有重复项。由于字符串一旦被读取就会被刷新到文件中,我们不会在内存中维护它。

我们不能使用哈希码,因为哈希码中的冲突可能会导致我们错过一个重复的字符串。我在谷歌搜索中发现的另外两种方法:

1.使用像MD5这样的消息摘要算法——但计算和存储的成本可能太高。

2.使用校验和算法。[我不确定这是否会为字符串生成唯一键-请有人确认]

有没有其他可用的方法。谢谢。

0 投票
3 回答
4099 浏览

java - 如何设置 MessageDigest 种子?

MessageDigest 类实现了 SHA-1 算法(以及许多其他算法)。SHA-1 算法允许使用不同的“种子”或初始摘要。请参阅SHA-1 伪代码

该算法初始化变量或种子:

但是,如Online Java Manual中所述,MessageDigest 类不提供用于设置这些初始变量的 API。事实上,它并没有说明初始变量的值。

如何设置 SHA-1 算法的初始种子?

Java 中使用初始种子的 SHA-1 示例在哪里?
(我正在寻找 SHA-1 实现,除非该示例使用MessageDigest替代初始种子。)

0 投票
2 回答
41976 浏览

security - 消息摘要、消息验证码和 HMAC 有什么区别?

我对消息摘要的理解是,它是一些与加​​密数据一起发送的数据的加密哈希,因此您可以验证数据没有被篡改。那么这个和消息认证码(MAC)和哈希MAC(HMAC)有什么区别?

0 投票
2 回答
845 浏览

cryptography - 碰撞攻击、消息摘要和可能的解决方案

我一直在消息摘要领域进行一些初步研究。特别是加密散列函数(例如 MD5 和 SHA-1)的冲突攻击,例如Postscript 示例X.509 证书副本

据我所知,在 postscript 攻击的情况下,生成了特定数据并将其嵌入到 postscript 文件的标题中(在渲染过程中被忽略),这导致 md5 的内部状态处于修改后的措辞文档的最终 MD 值与原始 postscript 文件相同。X.509 采用了类似的方法,将数据注入证书的注释/空白部分。

好的,这是我的问题,我似乎找不到任何人问这个问题:

  1. 为什么不将消耗的数据的长度作为最终块添加到 MD 计算中?

  2. 在 X.509 的情况下 - 为什么将空格和注释作为 MD 的一部分考虑在内?

诸如以下之一的简单过程是否不足以解决建议的碰撞攻击:

  1. MD(M + |M|) = xyz
  2. MD(M + |M| + |M| * magicseed_0 +...+ |M| * magicseed_n) = xyz

在哪里 :

  1. M : 是消息
  2. |M| : 消息的大小
  3. MD :是消息摘要函数(例如:md5、sha、whirlpool 等)
  4. xyz : 是消息 M 和 |M| 的实际消息摘要值的配对。<M,|M|>
  5. magicseed_{i}:是一组随机值,​​由种子根据添加大小之前的内部状态生成。

该技术应该有效,因为迄今为止所有此类碰撞攻击都依赖于向原始消息添加更多数据。

简而言之,生成碰撞消息所涉及的难度级别如下:

  1. 它不仅生成相同的MD
  2. 但也是可理解的/可解析的/兼容的
  3. 并且与原始消息的大小相同,

如果不是几乎不可能的话,也是非常困难的。有没有讨论过这种方法?任何指向论文等的链接都会很好。

进一步的问题:对于从 U 中随机选择的散列函数 H,公共长度的消息冲突的下限是多少,其中 U 是通用散列函数的集合?

是 1/N(其中 N 是 2^(|M|))还是更大?如果它更大,则意味着有超过 1 条长度为 N 的消息将映射到给定 H 的相同 MD 值。

如果是这样的话,找到这些其他消息有多实用?蛮力将是O(2 ^ N),有没有一种时间复杂度低于蛮力的方法?

0 投票
2 回答
900 浏览

delphi - 从delphi中的明文+私钥获取sha1消息摘要

我想创建一个 Sha1 消息摘要,它应该使用我的私钥作为输入以及纯文本。

到目前为止,我发现的所有内容要么不使用私钥,要么只使用大量证书作为输入。

0 投票
1 回答
285 浏览

java - Java中是否有用于散列的hexToString实现方法?

我正在使用一种散列字符串的小方法。寻找信息,我可以找到 MessageDigest 可以帮助我完成这项任务,here

计算字节数组的 SHA-1

但现在我有一个问题。似乎在 Java 中散列字符串的过程总是相同的:

  1. 您创建 MessageDigester 并指定要使用的算法。
  2. 您使用要散列的字符串更新 MessageDigester
  3. 然后你调用 MessageDigester.digest 得到一个 byte[]。

如果哈希最常用的功能之一是获取此哈希的字符串版本,为什么(在我提到的问题和其他一些问题中)人们必须实现他们的 convToHex 方法?

是否有 Java 方法允许我在 MessageDigester 返回的 byte[] 和 String 之间进行解析?如果存在,它在哪里??如果没有,为什么我必须制作自己的方法?

谢谢。

0 投票
1 回答
485 浏览

jsp - 我是否需要将 MessageDigest 对象从注册传递到登录?

好吧,我有点困惑。我正在尝试使用 MessageDigest 将我的密码作为 MD5 哈希存储在数据库中,然后在用户尝试登录时提取哈希以检查用户的密码。

因此,当用户在 register.jsp 中注册时,我使用此代码将他们的密码(该字符串在代码中称为“password”)转换为哈希(称为“hashtext”):

然后,我需要管理如何检查用户尝试登录时输入的密码。我有另一个页面:login.jsp,我在其中对输入的密码运行与上面完全相同的代码,并根据我从数据库中提取的哈希检查结果。

但是,这不起作用,我认为这是因为创建了一个新的 MessageDigest 对象 (MessageDigest.getInstance("MD5");),因此算法的工作方式不同。

我是否需要确保在 login.jsp 上使用与 register.jsp 相同的 MessageDigest 对象?