加密,哈希和密码问题,总菜鸟?

时间:2009-09-25 19:44:48

标签: security encryption hash cryptography passwords

我已经阅读了几篇关于此主题的stackoverflow帖子,特别是这一篇:

Secure hash and salt for PHP passwords

但我仍然有一些问题,我需要澄清一下,如果以下陈述属实,请告诉我并解释您的意见:

  1. 如果有人可以访问您的数据库/数据,那么他们仍然需要弄清楚您的哈希算法,并且您的数据仍然会有些安全,具体取决于您的算法?他们所拥有的就是哈希和盐。

  2. 如果有人可以访问您的数据库/数据和源代码,那么无论您做什么,您的哈希算法都可以进行逆向设计,您唯一可以拥有的就是如何您的算法复杂且耗时吗?

  3. 似乎最薄弱的环节是:您自己的系统有多安全以及谁有权访问它?


  4. Lasse V. Karlsen ......提出一个好点,如果你的数据受到损害,那么游戏结束......我的后续问题是:这些哈希试图防范什么类型的攻击?我读过关于彩虹表和字典攻击(蛮力),但这些攻击是如何进行的?

9 个答案:

答案 0 :(得分:6)

加密算法的安全性总是在他们的秘密输入中。合理的密码分析基于任何攻击者都知道您使用的算法的假设。良好的密码哈希是不可逆的和抗冲突的。这意味着,无论您是否知道所应用的算法,仍然需要做很多工作,从散列到生成它的值。

  1. 如果您使用了安全哈希,那么访问哈希,盐和算法仍然会为潜在的攻击者留下很多工作。
  2. 是的,安全哈希会让你很难反转算法。请注意,此反转不是“逆向工程”
  3. 弱链接可能是将密码哈希值导入数据库的进程和过程。有各种方法可以搞清楚和存储敏感数据。
  4. 正如我在评论中指出的那样,这些措施可以抵御攻击。首先,知道密码可能会导致授权执行超出数据库内容建议的内容。其次,这些密码可能会在其他地方使用,并且您会因为闯入而泄露密码,从而使您的用户面临风险。第三,通过散列,内部人员无法利用对数据库的只读访问权限(需要较少的审计等)来冒充用户。

    字典和彩虹表是加速散列反转的技术。

答案 1 :(得分:4)

您的问题是关于使用密码作为身份验证机制以及如何使用哈希将这些密码安全地存储在数据库中。您可能已经知道,目标是能够在不存储这些密码的情况下验证密码,我可以在数据库中清除文本。在这种情况下,让我试着回答你的每个问题:

  

如果有人可以访问您的数据库/数据,那么他们仍然需要弄清楚您的哈希算法,并且您的数据仍然会有些安全,具体取决于您的算法?他们所拥有的就是哈希和盐。

哈希密码的基本思想是攻击者了解哈希算法,并且可以访问哈希和盐。通过选择加密强哈希函数和对于每个密码不同的合适盐值,猜测密码所需的计算工作量太高以至于成本超过了攻击者从猜测密码中获得的可能增益。因此,要回答您的问题,隐藏哈希函数不会提高安全性。

  

如果有人可以访问您的数据库/数据和源代码,那么无论您做什么,您的哈希算法都可以进行逆向设计,您唯一能做到的就是复杂和时间消耗你的算法是?

你应该总是使用一个众所周知的(并且适当强大的)散列算法,并且逆向工程这个算法没有意义,因为你的代码中没有任何隐藏。如果您不是指逆向工程但实际上反向那么,是的,密码受到反转哈希函数(或猜测与哈希匹配的密码)的复杂性的保护值)。良好的哈希函数使得这非常困难。

  

似乎最薄弱的环节是:您自己的系统有多安全以及谁可以访问它?

一般情况下这是正确的,但是当通过将密码存储为哈希来保护密码时,您仍应假设攻击者可以完全访问哈希值,并通过选择适当的哈希函数和使用salt来相应地设计系统。 / p>

  

这些哈希试图防范什么类型的攻击?我读过关于彩虹表和字典攻击(蛮力),但这些攻击是如何进行的?

密码哈希防御的基本攻击是攻击者访问您的数据库时。无法从数据库中读取明文密码,密码也受到保护。

更复杂的攻击者可以使用与您相同的算法生成可能的密码列表并计算哈希值。然后,他可以将计算的哈希值与存储的哈希值进行比较,如果找到匹配则他有一个有效的密码。这是一种暴力攻击,通常假设攻击者对您的数据库具有“离线”访问权限。通过要求用户使用长而复杂的密码,“暴力破解”密码所需的工作量显着增加。

当攻击者想要攻击的不是一个密码,但是数据库中的所有密码都可以预先计算密码和哈希值对的大表,并通过使用所谓的哈希链进一步改进。彩虹表是这个想法的应用,可以用来同时强制许多密码,而不会显着增加工作量。但是,如果使用唯一的salt来计算每个密码的哈希值,则预先计算的表将变得无用,因为每个盐都不同,因此不能重复使用。

总结一下:默默无闻的安全性不是保护敏感信息的好策略,而现代密码术可以让您在不必采取隐蔽措施的情况下获取信息。

答案 2 :(得分:3)

  

这些哈希试图防范什么类型的攻击?

当有人从安全性较差的网站获取您的密码,将其撤消,然后尝试访问您的银行/ PayPal /等时,该类型。帐户。它一直在发生,许多人仍在使用相同(通常是弱)的密码。

作为旁注,从我所读到的内容来看,key derivation functions(PBKDF2 / scrypt / bcrypt)被认为比普通盐渍SHA更好/更安全(#1#2) -1 / SHA-2哈希由加密人。

答案 3 :(得分:1)

如果你只有哈希,没有盐,那么一旦他们知道你的数据(和算法),他们就可以通过彩虹表查找来获取你的密码。如果你有哈希和盐,他们可以通过燃烧大量CPU周期和构建彩虹表来获取密码。

如果您的所有数据的盐都相同,那么他们只需要烧掉大量的CPU周期来构建表,然后他们就拥有了所有的密码。如果你的盐并不总是相同,他们需要烧掉CPU周期,为每条记录制作一个独特的彩虹表。

如果盐足够长,他们需要的CPU周期变得非常昂贵。

如果您知道您的数据安全性遭到破坏,当然,您需要立即重置所有密码,因为据您所知,攻击者愿意花时间。

答案 4 :(得分:1)

  

如果有人可以访问您的数据库/数据,那么他们仍然可以访问   必须弄清楚你的哈希   算法和你的数据仍然是   有点安全,取决于你的   算法?他们所拥有的只是   哈希和盐。

这可能是一个真正专注的对手所需要的。这个答案的大部分取决于数据的价值,这会告诉你对手是多么有动力。信用卡号码将非常有价值,犯罪分子似乎有足够的时间和帮凶来完成他们的肮脏工作。已知一些坏人将密钥解密任务分配给僵尸网络!

  

如果有人可以访问您的数据库/数据和源代码,   然后似乎无论你是什么   你可以使用哈希算法   逆向工程,唯一的事情   你会在你身边   你的复杂和耗时   算法是?

如果他们可以访问您的源和所有数据,那么问题将是“您是如何将密钥首先加载到服务器的内存中的?”如果它嵌入在数据或程序代码中,则游戏结束并且您已经丢失了。如果操作员在机器启动时手动操作,则应该与您对操作员的信任一样安全。如果它存储在HSM *中,它仍然应该是安全的。

如果他们具有对运行的计算机的根级权限访问权限,那么他们可能会触发并恢复将显示密钥的内存转储。

  

似乎最薄弱的环节是:如何   保护自己的系统是谁和谁   可以访问吗?

这是事实。但是有一些替代方案可以帮助提高安全性。

对于通过安全和行业审计的银行类保护,建议您使用*硬件安全模块(HSM)执行密钥存储和加密/解密功能。我们正在寻找的商业实力HSM每个成本高达数千美元或更多,具体取决于容量。但我已经看到硬件加密卡插入PCI插槽,成本大大降低。

HSM背后的想法是加密发生在一个安全,强化的平台上,没有密钥,任何人都无法访问。他们中的大多数都有带有入侵检测开关,跳闸线,环氧树脂芯片和内存的机柜,如果被篡改将会自毁。即使合法的所有者或工厂也没有能够在没有授权加密密钥(通常在智能卡上携带)的情况下从HSM恢复数据库密钥。

对于非常小的安装,HSM可以像智能卡一样简单。但是,智能卡不是高性能加密设备,因此通过它们每秒不能超过一次解密事务。使用智能卡的系统通常只存储根密钥,然后解密智能卡上的工作数据库密钥并将其发送回数据库访问系统。如果攻击者可以访问正在运行的内存,或者攻击者可以嗅探进出智能卡的USB流量,这些仍会产生工作数据库密钥。

我没有让TPM芯片工作的经验(但是),但理论上它们可以用来在机器上安全地存储密钥。同样,当密钥加载到内存中时,仍然无法防止攻击者进行内存转储,但它们会阻止包含代码和数据的被盗硬盘驱动器泄露其秘密。

答案 5 :(得分:1)

哈希无法逆转。从概念上讲,将散列视为将值作为随机数生成器的种子进行散列,然后取出它生成的第500个数。这是可重复的进程,但它不是可逆进程。

如果在数据库中存储散列密码,当用户登录时,从输入到登录页面获取密码,对其应用相同的散列,然后将该操作的结果与你已经存储在数据库中。如果匹配,则用户键入正确的密码。 (或者,从理论上讲,他们可能输入的东西恰好散布到相同的值,但在实践中,你可以完全忽略它。)

盐的目的是,即使用户拥有相同的密码,你也无法分辨,还有许多其他与这个想法相同的东西。如果用户的密码是“secret”,并且salt是“abc”,那么您可以散列“secretabc”并将其结果存储在数据库中,而不是使用“secret”哈希。你也存储盐,但这是非常安全的存储 - 你无法从中找出任何有关密码的信息。

保护散列密码和盐的唯一理由是,如果攻击者拥有它的副本,他可以在自己的机器上离线测试密码,而不是反复尝试登录到您可能会锁定的服务器经过三次尝试或类似的事情,他出局了。即使你没有把他锁起来,在本地测试比等待网络往返要快得多。

答案 6 :(得分:0)

OP

  如果你的数据,

提出一个好点   然后游戏结束......我的   跟进问题是:什么类型的   攻击是这些哈希试图   防范?我读过   彩虹表和字典攻击   (蛮力),但这些是怎样的   管理攻击

讨论

除了攻击者之外,它不是游戏。研究这些术语:

  • 萨班斯 - 奥克斯利法案
  • Gramm-Leach-Bliley Act(GLBA)
  • HIPAA
  • Digital Millenium版权法(DMCA)
  • 爱国者法案

然后告诉我们(作为对你的思想挑衅)我们如何保护谁?一方面,这是无辜者对入侵者的努力 - 另一方面,如果系统的一部分失败,则是数据恢复。

这是一个有趣的实验,tcp / ip等原始意图被宣传为战争武器,受到攻击后的生存能力。好的,所以密码被哈希 - 没有人可以恢复它们......

其中,duh包括系统的所有者 - 运营商。

因此,您构建了一个强大的记录锁定工具来实现关键控制,然后政治压力迫使使用品牌x工具。

您可以阅读联邦信息安全管理法案(FISMA),当您阅读联邦信息安全管理法案时,某个地方的某个政府实体将整个磁盘被盗或被盗。

如果该磁盘上有您的个人身份信息,您将如何保护该磁盘。

我可以从Martin Liversage的口径和他们将关注的翡翠中告诉你。

答案 7 :(得分:-1)

以下是我对你的观点的看法:

  1. 如果人们可以访问您的数据库,那么您的安全问题比哈希算法和盐语更大。散列有些安全,但是存在散列冲突和散列查找等问题。
  2. 哈希是单向的,所以除非他们能猜出输入,否则即使用算法和盐也无法反转原始文本;因此名称是单向哈希。
  3. 安全是关于默默无闻和层层防御。如果您对防御进行分层并确定这些防御措施是什么,那么与依靠单一安全方法(如密码散列和运行OS /网络硬件更新)相比,您可以更好地避免攻击。抛出一些曲线球,比如网络服务器平台的障碍,以及产品网和数据库环境之间的界限。图层和隐藏实施细节会为您带来宝贵的时间。

答案 8 :(得分:-2)

当对密码进行散列时,它是单向的。所以即使你有盐,源和大量的cpu cyles要刻录,也很难获得密码。