我正在考虑使用RSA加密算法创建一个哈希函数(如md5或sha1)。我想知道这个算法是否有任何明显的原因不起作用:
要验证邮件与存储的哈希具有相同的哈希值,请使用保存的公钥并重复此过程。
这可行,安全且实用吗?
感谢您提出任何意见。
答案 0 :(得分:5)
RSA加密不是确定性的:如果你遵循RSA standard,你会看到注入了一些随机字节。因此,如果您使用RSA加密相同的消息两次,那么您可能无法获得相同输出的两倍。
此外,您的“未指定的第5步”可能很弱。例如,如果您定义一种方法来散列一个块,然后将这些块一起异或,那么 A || B 和 B || A (对于块大小)值 A 和 B )将散列为相同的值;那是碰撞的财富。
在学术上,已尝试用数论结构(即不是原始RSA,但重用相同类型的数学元素)构建散列函数;有关详细信息,请参阅this presentation from Lars Knudsen。同样地,ECOH hash function被提交用于SHA-3竞赛,其核心使用椭圆曲线(但它被“破坏”)。潜在的希望是哈希函数安全性可以某种方式与潜在的数论理论难题相关联,从而提供可证明的安全性。但是,实际上,这种散列函数要么慢,要么很弱,要么两者兼而有之。
答案 1 :(得分:3)
除了可能没有特别使用RSA算法之外,已经存在基本上这样做的哈希。它们被称为加密哈希,它们的突出之处在于它们在加密方面是安全的 - 这意味着进入公钥加密函数的同样的强度和面向安全的思想也已经进入了它们。
唯一的区别是,它们是从头开始设计为哈希值,因此它们也满足哈希函数的个别要求,这可以被视为加密函数不需要的额外强点。
此外,有两个因素在两者之间完全不一致,例如,您希望散列函数尽可能快而不影响安全性,而慢速通常被视为加密函数的一个特征,因为它限制了暴力攻击很大。
SHA-512是一个很棒的加密哈希,可能值得您关注。 Whirlpool,Tiger和RipeMD也是绝佳的选择。你不能错过任何这些。
还有一件事:如果你实际上希望它变慢,那么你肯定不想要一个哈希函数,而且这完全错了。如果,正如我所假设的那样,你想要的是一个非常非常安全的哈希函数,那么就像我说的那样,有很多选项比你的例子更适合,同时具有密码安全性甚至更多。
顺便说一下,我并不完全相信你的混音算法没有弱点。虽然每个RSA块的输出意图已经是均匀的,具有高雪崩等等,但我仍然担心这可能会对选择的明文或类似消息的比较分析造成问题。答案 2 :(得分:0)
在没有考虑太多的情况下,似乎就像加密安全一样。
但是,你必须小心选择明文攻击,如果你的输入很大,你可能会遇到速度问题(因为非对称加密比加密哈希明显慢)。
所以,简而言之:是的,这似乎可能是安全的......但除非有真正令人信服的理由,否则我会使用标准的HMAC,如果你想要一个键控哈希。< / p>
答案 3 :(得分:0)
通常情况下,最好使用公开可用且已经过审核流程的算法。尽管这些算法可能存在已知的弱点,但这可能比本土算法中的未知弱点更好。请注意,我并不是说提出的算法有缺陷;只是即使这里给出了大量的答案,说它似乎很好,但并不能保证它不会。当然,对于诸如MD5,SHA等算法也可以说同样的事情。但至少在这些算法中,很多人已经对它们进行了严格的分析。
除了之前针对设计自己的加密功能的“样板”警告之外,似乎所提出的解决方案在处理时间方面可能有些昂贵。对大型文档进行RSA加密可能会令人望而却步。
答案 4 :(得分:0)
如上所述,步骤 4.) 是确定性的,即仅使用模数和公钥指数。 如果第 3 步中的哈希值是私有的,那么这个概念对我来说似乎是安全的。
关于步骤 5.):在已知的内核算法 CBC 模式中,在加密之前完成与先前结果的混合,步骤 4.),可能更好地避免串通,例如使用懒散散列; XOR 没问题。
将应用这一点,因为已知哈希函数的可用实现可能有后门:)
确定性 Java RSA 是 here。