隐私数据 经过Hash的密码更不容易被破解

      隐私数据 经过Hash的密码更不容易被破解无评论

近期, 网站脱库事件频发,攻击者通过非法接入、sql注入等漏洞入侵网站服务器,盗取到用户个人隐私数据,侵犯数据的机密性和完整性;隐私数据在存储时的安全问题也需要关注,通过比较Encrypt和Hash两种加密方式的区别,在开发过程中更推荐使用Hash加密算法。

当服务器上需要存储密码时,第一个想法是简单地在数据库的相应表格中将它们保持为明文形式。但是,2018年,网络犯罪分子非常擅长获取此类密码。有众所周知的SQL注入和许多其他潜在的漏洞。假设攻击者在Web应用程序中发现了一个漏洞。无论如何,他都可以下载带有用户名和密码的表格。总的来说,他的进一步行动可能如下:

  • 在易受攻击的网站上假冒用户使用他们的凭据执行非法操作。例如,攻击者可以使用附加到该账户的银行卡。
  • 尝试在其他网站上使用密码。一些用户倾向于为不同的服务使用相同的密码,这是非常危险的。
  • 尝试了解创建密码的规则并将其用于其他网站。用户经常使用不同网站上的密码,但他们遵循相同的规则来创建这些密码,并且可以识别这些规则。
  • 提升权限。获得管理员密码。

加密(Encrypt)和哈希(Hash)的区别

  概括来说,哈希(Hash)是将目标文本转换成具有相同长度的、不可逆的杂凑字符串(或叫做消息摘要),而加密(Encrypt)是将目标文本转换成具有不同长度的、可逆的密文。

1、哈希算法往往被设计成生成具有相同长度的文本,而加密算法生成的文本长度与明文本身的长度有关。

      例如,设我们有两段文本:“Microsoft”和“Google”。两者使用某种哈希算法得到的结果分别为:“140864078AECA1C7C35B4BEB33C53C34”和“8B36E9207C24C76E6719268E49201D94”,而使用某种加密算法的到的结果分别为“Njdsptpgu”和“Hpphmf”。可以看到,哈希的结果具有相同的长度,而加密的结果则长度不同。实际上,如果使用相同的哈希算法,不论你的输入有多么长,得到的结果长度是一个常数,而加密算法往往与明文的长度成正比。

2、哈希算法是不可逆的,而加密算法是可逆的。

      这里的不可逆有两层含义,一是“给定一个哈希结果R,没有方法将E转换成原目标文本S”,二是“给定哈希结果R,即使知道一段文本S的哈希结果为R,也不能断言当初的目标文本就是S”。其实稍微想想就知道,哈希是不可能可逆的,因为如果可逆,那么哈希就是世界上最强悍的压缩方式了——能将任意大小的文件压缩成固定大小。

      加密则不同,给定加密后的密文R,存在一种方法可以将R确定的转换为加密前的明文S。

攻击经过hash的密码

攻击者设法使用用户名和密码来获取我们的表。密码现在被hash,但这并不能阻止我们的攻击者,他对此非常认真,并打算恢复密码。这是他可能采取的进一步行动:

  • 字典攻击。如果管理员的主密码不起作用,攻击者将转向最常用的密码列表,并尝试运用他们的哈希运气。
  • 彩虹桌。攻击者可能不需要发起字典暴力攻击。攻击者可能会使用互联网上广泛使用的彩虹表。彩虹表包含散列函数和相应的输入数据,之前已由某人计算。值得注意的是,由于碰撞,彩虹表提供的密码不一定是用户创建的密码。预先计算的值已经可用于MD5,SHA1,SHA256,SHA512以及它们的修改。
  • 彻底搜索。如果上面的方法没有帮助,你将不得不求助于穷举并搜索所有可能的密码,直到哈希函数最终匹配。

在最常见的情况下,攻击者必须暴力破解密码。此外,在这里,他的成功将取决于计算散列函数的速度等。例如,64位Windows 10上的Java实现的哈希函数(一个Intel i7 2.60GHz和16GB内存)在100万次启动后计算出一个36个字符的哈希长度。他们交付了以下结果:

MD5 – 627毫秒

SHA-1 – 604毫秒

SHA-256 – 739毫秒

SHA-512 – 1056毫秒

然而,今天的暴力攻击可以并行化,并且可以使用GPU(以及APU,DSP和FPGA)以更快的速度运行。但是,除了选择更长的算法和更长的输出之外,您还可以做其他事情。

 

散列哈希

为了防止入侵者使用现成的彩虹表,有一种技术可以多次对密码进行散列处理。也就是说,我们根据哈希散列中的散列来计算散列……这样做N次。但是,建议不要着迷于此,因为通常验证用户的密码,服务器也必须这样做。现在彩虹桌不容易使用,暴力攻击的时间明显增加。

但是,没有任何东西可以阻止攻击者使用通用密码列表生成他自己的彩虹表,并知道使用的哈希算法。

增加使用salt

为了避免上述情况,密码现在与salt一起散列。

salt是一个附加的随机字符串,它被添加到密码中并与其一起散列。即使知道盐和输出哈希值,攻击者也注定要蛮力,并且没有预先计算好的表可能会帮助他。

“salting”密码的分类:

1.通过salting的原理:

  • 为每个用户提供独特的salt。即使salt被攻击者知道,他也必须暴力破解对方的密码。此外,即使两个用户相似并且提供相同的密码,输出上的哈希值也会不同。
  • 全部盐都是相同的,用于所有哈希。
  • 上述两种变体。

2.通过储salt方式:

  • 数据库存储。通常,单个salt与密码哈希存储在同一个数据库中。
  • 代码存储。全球salt通常不是存储在数据库中,而是存储在配置文件中,以便罪犯必须花时间在它上面。

我们假设用户的单个salt存储在数据库中,并且全局salt存储在配置文件中。攻击者可以访问数据库,并且他知道所有的哈希和相应的盐(全局salt不存储在数据库中,并且他不知道它)。如果他结合了所有可用的方法,那么要获取密码在明文中,他非常注重目标,他将面临以下障碍:

  1. 他不知道全球salt,所以它将不得不被迫。
  2. 他知道用户的salt,但他没有合适的预制表和这些salt,所以他必须暴力破解密码。
  3. 这个过程需要更多的时间,因为有必要将哈希散列N次。

哈希在密码加密中更胜一筹

因此,以明文保存密码不是一个好主意。我们应该做什么?存储以某种方式加密的密码会很好。即使他们被检索到,攻击者也无法阅读和使用它们,或者至少会花费很多时间来恢复它们。

我们到了必须在两种方法之间进行选择的地步:加密密码或使用哈希。我们来比较这些选项。

1.执行时间。加密需要更多时间。我们选择不可加密的加密算法,我们将不得不在每次密码检查时加密和解密数据。哈希函数的一个要求是执行速度。

2.输出值的长度。数据加密的结果具有可变长度。哈希的最终结果总是相同的。另外,将统一大小的数据存储在数据库中非常方便。我们不要忘记密码长度以加密形式提供有关原始密码长度的线索。然而,相同长度的Hash可能导致碰撞的可能性。

3.密钥管理。使用加密,你需要一个密钥。这些密钥必须存储在希望没有人会找到它们的地方。关键的生成和管理是一件大事。他们应该很强大,需要定期更换,等等。

4.碰撞的可能性。加密时,由不同输入数据形成的输出数据将始终不同。当它被哈希时,情况并非总是如此。相同的散列长度意味着散列函数的输出值集合是有限的,这导致了碰撞的可能性。

因此,在大多数情况下,哈希更胜一筹。

 

 

发表评论