我试图想出一个好的散列函数的string。 我认为总结string中前五个字符的unicode值可能是一个好主意(假设它有五个,否则停止它的结束)。 这是一个好主意,还是一个坏主意? 我在Java中这样做,但我不会想象这会有很大的不同。
结论: SHA-1与任何对付原像攻击的攻击一样安全,但它易于计算,这意味着安装暴力破解或字典攻击更容易。 (对于像SHA-256这样的后继者也是如此)。根据具体情况,被devise为计算成本高昂的散列函数(比如bcrypt)可能是更好的select。 有些人大肆宣传“SHA-1已经破产”这样的言论,所以我试图去理解这个意思。 假设我有一个SHA-1密码哈希数据库,攻击者使用最新的SHA-1破解algorithm和一个拥有100,000台计算机的僵尸networking访问它。 (控制10万台家用电脑就意味着他们每秒可以做10 ^ 15次左右的操作。)他们需要多less时间 找出任何一个用户的密码? 找出给定用户的密码? 找出所有用户的密码? find一种方式作为用户之一login? find一种方式作为特定的用户login? 如果密码被腌制,这个变化如何? 腌制的方法(前缀,后缀,两者,还是像xor-ing更复杂的东西)的问题? 这是我目前的理解,一些谷歌search。 如果我误解了某些东西,请在答案中予以纠正。 如果没有盐,彩虹攻击会立即find所有的密码(除了非常长的密码)。 如果有足够长的随机盐,找出密码的最有效的方法是暴力或字典攻击。 冲突和原像攻击都不能帮助find真正的密码,所以对SHA-1的encryption攻击在这里没有任何帮助。 甚至使用什么algorithm都不算什么 – 甚至可以使用MD5或MD4,密码也是一样安全的(因为计算SHA-1散列速度较慢,所以稍有不同)。 为了评估“同样安全”的安全性,我们假设一次sha1运行需要1000次操作,并且密码包含大写,小写和数字(即60个字符)。 这意味着攻击者每天可以testing10 15 * 60 * 60 * 24/1000〜= 10 17的潜在密码。 对于暴力攻击,这意味着要在3个小时内testing所有密码,最多9个字符,一周最多10个字符,一年最多11个字符。 (每增加一个字符,就要花费60倍)字典攻击要快得多(甚至一台计算机的攻击者可能会在几个小时内就把它拉出来),但是只能find弱密码。 要以用户身份login,攻击者不需要find确切的密码; find一个导致相同散列的string就足够了。 这被称为第一次原像攻击。 据我所知,没有对SHA-1的原像攻击。 (暴力攻击需要2 160次操作,这意味着我们的理论攻击者需要10年30年的时间才能完成,理论可能性的限制大约是60次 ,攻击将需要几年时间)。 对减less的SHA-1版本的影响可以忽略不计(对于减less的SHA-1使用44步而不是80步,攻击时间从2 160次降到2 157次 )。 对SHA-1的碰撞攻击在理论上是可能的( 我发现的最好的结果是从2 80到2 52 ),但是对于密码哈希值,即使没有腌制,也是无用的。 简而言之,使用SHA-1存储密码看起来非常安全。 我错过了什么? 更新: […]
使用案例:“我忘记了我的密码”button。 我们无法find用户的原始密码,因为它是以散列forms存储的,所以唯一要做的就是生成一个新的随机密码并通过电子邮件发送给他。 这需要密码不可预知的随机数,对于这个数字,mt_rand不够好,一般来说,我们不能假定托pipe服务将提供访问操作系统来安装密码随机数模块等,所以我正在寻找一种方法在PHP本身中生成安全的随机数字。 我到目前为止提出的解决scheme涉及存储一个初始种子,然后为每个电话, result = seed seed = sha512(seed . mt_rand()) 这是基于sha512哈希函数的安全性(mt_rand调用只是为了让对手获得数据库副本的生命变得更困难)。 我错过了什么,还是有更好的已知解决scheme?
我不确定密码哈希如何工作(稍后将实现),但现在需要创build数据库模式。 我想限制密码为4-20个字符,但据我所知encryption后的哈希string将是不同的长度。 那么,如何将这些密码存储在数据库中呢?
在工作中,我们有两个相互竞争的盐理论。 我所使用的产品使用类似于用户名或电话号码的forms来encryption散列。 本质上,每个用户都有所不同,但是我们随时可用。 另一个产品为每个用户随机生成一个盐,每当用户更改密码时都会更改。 盐在数据库中被encryption。 我的问题是如果第二种方法真的有必要? 我从纯粹的理论angular度可以理解,它比第一种方法更安全,但从实践的angular度来看呢。 现在要validation用户,salt必须是未encryption的并应用于login信息。 思考一下之后,我从这个方法看不到真正的安全收益。 即使攻击者知道如何快速确定每个帐户的内容,但是将帐户之间的差异更改为帐户,仍然使得有人尝试强制哈希algorithm变得极其困难。 这是假设密码足够强。 (很明显,find一组密码的正确哈希,它们都是两位数字比find8位密码的正确哈希要容易得多。 我在逻辑上是不正确的,还是有我失踪的东西? 编辑:好吧,这就是为什么我认为这是真的没有什么encryption盐。 (让我知道我是否在正确的轨道上)。 对于下面的解释,我们假定密码总是8个字符,salt是5,所有的密码都是由小写字母组成(这只是使math更容易)。 对于每一个入口,盐的含量不同意味着我不能使用同一个彩虹桌(实际上,如果我有足够的尺寸,我可以做到这一点,但是暂时忽略这一点)。 根据我的理解,这是真正的盐的关键,因为要破解每一个帐户,我必须重新发明轮子,为每一个说话。 现在,如果我知道如何将正确的salt应用于密码来生成散列,我会这样做,因为salt实际上只是扩展了散列短语的长度/复杂度。 所以我会减less我需要产生的可能组合的数量,以“知道”我有13 ^ 26到8 ^ 26的密码+盐,因为我知道盐是什么。 现在,这使得它更容易,但仍然很难。 所以encryption盐。 如果我知道盐是encryption的,我不会尝试解密(假设我知道它有足够的encryption级别)。 我会忽略它。 回到前面的例子,我只想生成一个包含13 ^ 26所有键的更大的彩虹表,而不是试图找出解密的方法。 不知道盐会一定减慢我的速度,但我不认为这会增加尝试破解盐encryption的巨大任务。 这就是为什么我不认为这是值得的。 思考? 这里是一个链接,描述了在一个暴力攻击下密码将持续多长时间: http : //www.lockdown.co.uk/? pg=combi
我在看哈希algorithm,但无法find答案。 Bcrypt使用河豚 河豚比MD5好 问:但是Blowfish比SHA512更好吗? 谢谢.. 更新: 我想澄清一点,我明白哈希和encryption之间的区别。 是什么促使我以这种方式提出这个问题,本文作者将bcrypt称为“自适应哈希” https://www.nccgroup.trust/us/about-us/newsroom-and-events/blog/2007/ 7月/够了,用最彩虹表,什么,你需要到专门关于安全密码的scheme/ 由于bcrypt基于Blowfish,所以我被认为Blowfish是一个哈希algorithm。 如果答案已经指出encryption,那么在我看来,这不应该在这篇文章中有一席之地。 更糟糕的是,他认为bcrypt是最好的。 现在让我困惑的是,phpass类(用于密码哈希algorithm)使用bcrypt(即blowfish,即encryption)。 基于这个新的信息,你们告诉我(河豚是encryption),这个class听起来不对。 我错过了什么吗?
更新:我最近从这个问题中得知,在下面的整个讨论中,我(我确信其他人也是)也有点混乱:我一直称之为彩虹表,实际上称为哈希表。 彩虹表是更复杂的生物,实际上是Hellman哈希链的变种。 虽然我相信答案仍然是一样的(因为它不能归结为密码分析),但是有些讨论可能有些偏差。 这个问题:“ 什么是彩虹桌,他们是如何使用的? ” 通常情况下,我总是build议使用密码强的随机值作为盐,与散列函数(例如密码)一起使用,以防止彩虹表攻击。 但是,盐是随机的,它实际上是密码学上必要的吗? 任何独特的价值(唯一的每个用户,例如userId)在这方面就足够了? 它实际上会阻止使用单个彩虹表来破解系统中的所有(或大部分)密码。 但熵的缺乏是否真的削弱了哈希函数的密码强度呢? 请注意,我不是问为什么要使用盐,如何保护它(不需要),使用单个常量散列(不),或使用什么样的散列函数。 盐是否需要熵。 感谢所有答案到目前为止,但我想专注于我(一点)不太熟悉的领域。 密码分析的主要影响 – 我会很感激,如果有人有一些来自encryptionmathPoV的input。 另外,如果还有额外的vector没有被考虑,那也是很好的input(参见@Dave Sherohman指向多个系统)。 除此之外,如果您有任何理论,想法或最佳实践 – 请以证据,攻击情景或经validation据作为背景。 或者甚至是可以接受的权衡的有效考虑…我对这个问题上的最佳实践(资本B资本P)很熟悉,我想certificate这实际上提供了什么价值。 编辑:这里有一些非常好的答案,但我认为@Dave说,它归结为彩虹表的常见用户名称…也可能不太常用的名称。 但是,如果我的用户名是全球唯一的呢? 不一定是我的系统唯一的,但每个用户 – 例如电子邮件地址。 对于单个用户来说,build立RT是没有任何意义的(正如@Dave强调的那样,盐不是保密的),这仍然会阻止集群。 唯一的问题是,我可能会在不同的网站上有相同的电子邮件和密码 – 但盐无论如何不会阻止。 所以,它回到了密码分析 – 熵是必要的,还是不是? (我目前的想法是从密码分析的angular度来看没有必要,但是这是出于其他实际的原因)。
很久以前,我以1.25美元的价格从便宜的桌子上买了一本数据结构书。 其中,哈希函数的解释说,由于“math的本质”,它最终应该被素数修改。 你对1.25美元的书有什么期望? 无论如何,我已经有数年的时间来思考math的本质了,至今仍然无法解决这个问题。 数字的分布是否真的更加平均,当存在一个素数的桶时? 还是这是一个老的程序员的故事,每个人都接受,因为其他人都接受它?
使用可变对象作为Hashmap键是不好的做法吗? 当您尝试使用已修改足以更改其哈希码的密钥从Hashmap中检索值时会发生什么? 例如,给出 class Key { int a; //mutable field int b; //mutable field public int hashcode() return foo(a, b); } 与代码 HashMap<Key, Value> map = new HashMap<Key, Value>(); Key key1 = new Key(0, 0); map.put(key1, value1); key1.setA(5); key1.setB(10); 如果我们现在调用map.get(key1)会怎么样? 这是安全还是可取的? 或者是依赖于语言的行为?
我正在寻找一个哈希表如何工作的解释 – 用简单的英语为我这样的傻瓜! 例如,我知道它需要的关键,计算散列(我正在寻找一个解释如何),然后执行某种模数来找出它存储在数组中的位置,但这是我的知识停止。 任何人都可以澄清这个过程吗? 编辑:我没有具体询问如何计算哈希代码,而是一个哈希表如何工作的一般概述。