密码和不同类型的加密

2024-02-29

我知道,我知道,类似的问题已经被问过数百万次了,但由于大多数问题都有不同的风格,所以我有自己的风格。

目前我正在开发一个网站,该网站打算在全国范围内推出,因此需要对用户系统进行某种保护。

我最近读了很多关于密码加密、散列、加盐……凡是你能想到的内容,但读了这么多文章后,我感到困惑。

有人说普通的 SHA512 加密足以作为密码,有人说无论你做什么都必须使用“盐”,然后还有人说你应该建造一台全新的机器来加密密码,因为这样就没有人能够得到它.

现在我正在使用hash_hmac();使用 SHA512,加上,密码获取随机 SHA1 salt 和最后一部分,定义随机 md5();钥匙。对于我们大多数人来说,这听起来很安全,但这是吗?
我最近读到这里,bcrypt();(现在称为crypt();使用 Blowfish 哈希)是最安全的方法。阅读 PHP 手册后crypt();和相关的东西,我很困惑。

基本上,问题是,我会hash_hmac();击败地狱河豚鱼 crypt();或相反亦然?

另外,也许还有更安全的密码哈希选项?


正确应用密码学的关键是足够精确地定义您所追求的属性。

通常,当有人想要对密码进行哈希处理时,是在以下上下文中:服务器正在对用户进行身份验证;用户通过机密通道(HTTPS...)显示他们的密码。因此,服务器必须存储用户密码,或者至少存储可用于verify一个密码。我们不想“按原样”存储密码,因为获得服务器数据库读取访问权限的攻击者将了解所有密码。这是我们的攻击模型.

A password is something which fits in the brain of the average user, hence it cannot be fully unguessable. A few users will choose very long passwords with high entropy, but most will select passwords with an entropy no higher than, say, 32 bits. This is a way of saying that an attacker will have to "try" on average less than 231 (about 2 billions) potential passwords before finding the right one.

无论服务器存储什么,只要验证密码就足够了;因此,我们的攻击者拥有尝试密码所需的所有数据,仅受他可以聚集的计算能力的限制。这被称为离线字典攻击.

我们必须假设我们的攻击者可以破解一个密码。那时我们可能希望有两个属性:

  1. 破解单个密码应该很困难(只需几天或几周,而不是几秒钟);
  2. 开裂two密码应该是twice就像敲开一个一样难。

这两个特性需要不同的对策,这些对策可以结合起来。

1. 慢哈希

Hash functions are fast. Computing power is cheap. As a data point, with SHA-1 as hash function, and a 130$ NVidia graphic card, I can hash 160 millions passwords per second. The 231 cost is paid in about 13 seconds. SHA-1 is thus too fast for security.

另一方面,用户不会看到 1μs 内完成身份验证和 1ms 内完成身份验证之间有任何区别。所以这里的技巧是以一种使其变慢的方式扭曲哈希函数。

例如,给定一个哈希函数H,使用另一个哈希函数H'定义为:

H'(x) = H(x || x || x || ... || x)

where '||' 表示串联。简而言之,重复输入足够多次,以便计算H'函数需要一些不可忽略的时间。所以你设定了一个时间目标,例如1ms,并调整达到该目标所需的重复次数。 10ms 意味着您的服务器每秒能够验证 10 个用户,而只需花费其 10% 的计算能力。请注意,我们讨论的是存储散列密码以供其自身不可告人使用的服务器,因此这里不存在互操作性问题:每个服务器都可以使用为其功能量身定制的特定重复计数。

假设现在攻击者可以拥有你100倍的计算能力;例如攻击者是一名无聊的学生——许多安全系统的克星——并且可以使用大学校园内的数十台计算机。此外,攻击者可能会使用更彻底优化的哈希函数实现H(您正在谈论 PHP,但攻击者可以进行汇编)。而且,攻击者是patient:用户不能等待超过几分之一秒,但足够无聊的学生可能会尝试几天。然而,尝试 20 亿个密码仍然需要大约 3 天的计算时间。这并不是最终安全的,但比一台廉价 PC 上的 13 秒要好得多。

2. Salts

A salt是一段公共数据,您可以使用密码对其进行哈希处理,以防止sharing.

当攻击者可以对多个受攻击的密码重复使用其哈希值时,就会发生“共享”。当攻击者拥有多个散列密码(他读取散列密码的整个数据库)时,就会发生这种情况:每当他散列时one潜在的密码,他可以对照查找all他试图攻击的散列密码。我们称之为并行字典攻击。共享的另一个实例是攻击者可以构建一个预先计算的哈希密码表,然后重复使用他的表(通过简单的查找)。传说中的彩虹桌只是预计算表的一个特例(这只是时间与内存的权衡,允许使用比硬盘上所能容纳的大得多的预计算表;但构建表仍然需要对每个潜在密码进行哈希处理)。时空方面,并行攻击和预计算表是相同的攻击。

加盐会打败共享。盐是一种public改变散列过程的数据元素(可以说盐selects一整套不同函数中的哈希函数)。盐的要点是它对于每个密码都是唯一的。攻击者无法再分享破解工作,因为任何预先计算的表都必须使用特定的盐,并且对于使用不同盐进行哈希处理的密码毫无用处。

必须使用盐来验证密码,因此服务器必须为每个散列密码存储用于散列该密码的盐值。在数据库中,这只是一个额外的列。或者您可以将盐和哈希密码连接在一个 blob 中;这只是数据编码的问题,这取决于您。

假设S作为盐(即一些字节),密码的哈希过程p is: H'(S||p)(与H'上一节中定义的函数)。就是这样!

盐的要点是,每个散列密码尽可能是唯一的。实现这一目标的一个简单方法是使用随机盐:每当创建或更改密码时,使用随机生成器获取 16 个随机字节。 16 个字节应该足以使盐重用几乎不可能。请注意,每个盐应该是唯一的password:使用用户名作为盐是不够的(一些不同的服务器实例可能有同名的用户——那里存在多少个“bob”?——还有一些用户change他们的密码,并且新密码不应使用与以前的密码相同的盐)。

3. 哈希函数的选择

The H'哈希函数是在哈希函数的基础上构建的H。一些传统的实现使用了扭曲为散列函数的加密算法(例如 Unix 的 DES)crypt())。这促进了“加密密码”表达式的使用,尽管它并不恰当(密码未加密,因为没有解密过程;正确的术语是“散列密码”)。然而,使用真正的哈希函数(专为哈希目的而设计)似乎更安全。

最常用的哈希函数有:MD5、SHA-1、SHA-256、SHA-512(后两者统称为“SHA-2”)。 MD5 和 SHA-1 中发现了一些弱点。这些弱点严重影响some用法,但是not如上所述(弱点在于碰撞,而我们在这里研究原像抵抗)。不过,公共关系最好选择 SHA-256 或 SHA-512:如果使用 MD5 或 SHA-1,你可能要为自己辩解。 SHA-256 和 SHA-512 的不同之处在于输出大小和性能(在某些系统上,SHA-256 比 SHA-512 快得多,而在其他系统上,SHA-512 比 SHA-256 快)。然而,性能在这里不是问题(无论哈希函数的固有速度如何,我们通过输入重复使其速度变慢),并且 SHA-256 输出的 256 位已经足够了。将哈希函数输出截断到第一个n为了节省存储成本,只要保留至少 128 位(n >= 128).

4。结论

每当您创建或修改密码时,都会生成新的随机盐S(16 字节)。然后对密码进行哈希处理p as SHA-256(S||p||S||p||S||p||...||S||p)哪里 'S||p' 模式重复足够多次,以至于哈希过程需要 10 毫秒。存储两者S和哈希结果。要验证用户密码,请检索S,重新计算哈希值,并将其与存储的值进行比较。

你会活得更久、更快乐。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

密码和不同类型的加密 的相关文章

  • 使用 SSL 设置 .Net IBM.XMS 客户端

    我必须创建一个客户端来侦听队列上的消息 正在使用 SSL 我正在 dot net 中进行开发 我浏览了数百页的文档和论坛 找到了一些清晰简洁的内容 但看起来事实并非如此 我有一个 jks 并且我能够 telnet 到正在发布队列的服务器 下
  • 如何将pgp私钥传输到另一台计算机? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 I read 本文 http www robertsosinski com 2008 02 18 working with pgp and mac o
  • 使用 AesManaged“填充无效且无法删除”

    我正在尝试使用 AesManaged 进行简单的加密 解密 但在尝试关闭解密流时不断出现异常 这里的字符串被正确加密和解 密 然后在 Console WriteLine 打印正确的字符串后 我收到 CryptographicExceptio
  • AES 会话密钥的 RSA 解密失败,并显示“AttributeError:‘bytes’对象没有属性‘n’”

    我正在努力在 Python 3 6 上从 PyCryptodome 实现公钥加密 当我尝试创建对称加密密钥并加密 解密变量时 一切正常 但是当我引入 RSA 和 PKCS1 OAEP 的那一刻 一切就都顺理成章了 session key加密
  • 如何将 pem 公钥转换为 openssl RSA* 结构

    假设我必须像这样公开 pem 密钥 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7vbqajDw4o6gJy8UtmIbkcpnk O3Kwc4qsEnSZp TR fQi
  • 如何将两个不同的哈希数组中的值添加在一起?

    我有两个哈希数组 哈希值的键不同 player scores1 first name gt Bruce score gt 43 time gt 50 first name gt Clark score gt 45 minutes gt 20
  • IOS 上图像的加密/解密

    我们正在使用加密 解密和 UIIMAGE 如果我们加密和解密 UIIMAge 而不保存到 iphone 画廊中 它工作正常 但如果我们加密 保存到画廊中 将 加密的图像 加载到应用程序中 然后解密它效果不好 我们使用这个函数来加密 解密 保
  • 在数据库中存储密码的最佳方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 在 ASP.NET 中加密 cookie

    我想在 ASP NET 中加密 cookie 我已关注本文的方法 http www codeproject com KB web security HttpSecureCookie aspx 但它有一个缺点 那就是在内部方法上使用反射 这导
  • PHP - hash_pbkdf2 函数

    我正在尝试使用此 php 函数执行一个函数来哈希密码 http be php net manual en function hash pbkdf2 php http be php net manual en function hash pb
  • python的hash()是持久的吗?

    Is the hash python 中的函数保证对于给定的输入始终相同 无论输入的时间 地点如何 到目前为止 仅从反复试验来看 答案似乎是肯定的 但最好了解其工作原理的内部原理 例如 在测试中 python gt gt gt from i
  • 检查字符串是否是哈希值

    我正在使用 SHA 512 来散列我的密码 当然还有盐 我认为我想要的不可能 但无论如何我们还是要问一下 有没有办法检查字符串是否已经是 SHA 512 或其他算法 哈希值 当用户登录时 我想检查他的密码 如果它仍然是纯文本 则应将其转换为
  • RSACryptoServiceProvider 使用自己的公钥和私钥进行加密和解密

    据我所知 对于非对称加密 您可以使用公钥加密明文并使用私钥解密 所以我尝试了以下方法 static void Main string args RSACryptoServiceProvider rsa new RSACryptoServic
  • 加密安全随机数生成器如何工作?

    我了解标准随机数生成器的工作原理 但在使用密码学时 随机数确实必须是随机的 我知道有一些仪器可以读取宇宙白噪声 http en wikipedia org wiki Hardware random number generator帮助生成安
  • 使用 AES 解密时输入数据不是完整的块

    我正在尝试加密来自 oracle 的数据 然后使用 C 解密它 到目前为止 我设法编写了一个在 C 和 Oracle 中加密数据的代码 并且得到了匹配的结果 我试图用 C 解密数据 但收到错误 输入数据不是一个完整的块 甲骨文加密 SELE
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • 从哈希中删除 nil 值

    我希望从哈希中删除具有nil value article是一个存储每篇文章的类 并且attributes方法将文章存储为散列 预期结果 articles results author null title Former bar manage
  • Android中从一个应用程序向另一个应用程序发送数据时的加密

    我想将敏感数据从一个应用程序发送到另一个应用程序 我使用 Intent 并通过 Bundle 发送数据 现在 我应该使用加密算法来加密要发送的数据 同时接收器应用程序将解密数据 哪种算法最适合移动平台 我浏览过RSA文档 建议不建议用于长文
  • 将 PHP 中的 openssl AES 转换为 Python AES

    我有一个 php 文件 如下所示 encryption encoded key c7e1wJFz PBwQix80D1MbIwwOmOceZOzFGoidzDkF5g function my encrypt data key encrypt
  • 启用 TLSv1.2 和 TLS_RSA_WITH_AES_256_CBC_SHA256 密码套件

    Server TLS Version v1 2 Cipher Suite TLS RSA WITH AES 256 CBC SHA256 Client JRE 1 7 当我尝试直接通过 SSL 从客户端连接到服务器时 收到以下错误 Caus

随机推荐