主页 > 安卓怎么下载imtoken钱包 > 用户密码的加密存储10问10答,一篇讲解密码安全存储的文章

用户密码的加密存储10问10答,一篇讲解密码安全存储的文章

安卓怎么下载imtoken钱包 2023-02-01 05:44:47

我们的数据库权限管理很严格,敏感信息开发工程师看不到,密码不能明文存储?

不可能的。 存储在数据库中的数据存在很多威胁,例如应用层、数据库级别、操作系统级别、机房级别和人员级别。 很难避免被黑客窃取。 如果密码被加密存储,即使把黑客拖走,黑客也很难得到用户的明文密码。 可以说,密码加密存储是用户账户体系的内衣。 这相当于在你一个人呆着的时候把钱缝在你的内衣里。 尽管使用它们的概率很小,但它们可以在关键时刻挽救生命。

然后使用 AES 等加密算法对密码进行加密并再次保存。 我在需要明文时解密。

不可能的。 这涉及到用于加密和解密的密钥如何保存。 虽然密钥通常与用户信息分开存储,但业界也有一些成熟的基于软件或硬件的密钥存储方案。 但是,与保存用户信息一样,密钥不可能做到100%的保密。 通过这种方式对密码进行加密,可以降低黑客获取明文密码的概率。 但是一旦密钥泄露,用户的明文密码也会被泄露,这不是一个好办法。 此外,用户帐户系统不应存储用户的明文密码。 当用户忘记密码时,可以重设密码而不是找回密码。

保存所有密码哈希值,例如 MD5。 我可以?

并非所有的散列算法都可以使用。 准确地说,它应该是一个密码哈希。 加密散列具有以下特征:

比特币采用的哈希算法是_比特币哈希值怎么查_比特币原理与挖矿算法

给定任意大小和类别的输入,哈希计算非常快; 给定一个散列,没有办法计算对应于散列的输入; 如果你对输入做一个小改动,散列值会发生很大变化; 没有方法计算具有相同散列的两个输入;

虽然它不是为加密密码而设计的,但它的第二、第三和第四个属性使加密哈希成为加密用户密码的理想选择。 常见的加密哈希是 MD5、SHA-1、SHA-2、SHA-3/keccak、blake2。 自 1976 年以来,业界使用密码哈希来加密用户密码,最早出现在 UNIX crypt 中。 但是MD5和SHA-1已经被破解,不适合存储密码。

然后保存用户密码的sha256值。

不可能的。 黑客可以使用查找表或彩虹表破解用户密码。 需要注意的是破解密码不是sha256。 据sha256介绍,密码之所以能够被破解比特币采用的哈希算法是,是因为用户密码往往需要脑记忆和人工输入,所以密码不会太复杂,往往有长度限制和一定的取值空间。

比如8位密码,只有10^8=100000000种可能。 一亿条数据并不多。 黑客可以预先计算出0-9999999的sha256,存储为以sha256为key,password为value的查找表。 当需要破解给定的sha256时,可以从表中查询。

比如有(10+26+26)^10 ~= 84亿个允许数字和字母大小写的密码。 记录太多,很难将它们全部保存在查找表中。 此时,黑客会使用一种叫做彩虹表的技术进行破解。 Rainbow Tables 使用经典的计算机世界来解决问题、时间和空间的权衡。 在这种情况下,如果没有足够的空间,则需要更多时间。 在彩虹表中,可以将所有的sha256值转换成若干条长度相同的hash链,只保存hash链的头和尾。 破解时先查询sha256所在的hash链,然后计算hash链上的所有sha256,再通过实时比对破解用户密码。

比特币原理与挖矿算法_比特币采用的哈希算法是_比特币哈希值怎么查

上图展示了一个哈希链长度为3的彩虹表。在哈希链中,需要使用R函数将哈希值映射回密码值空间。 为了降低R函数的碰撞概率,在长度为k的哈希链中的彩虹表中使用了kr函数。 由于每次迭代映射回密码空间的R函数都不同,这种破解方法称为彩虹表攻击。

事实上,哈希链比上面的例子要长得多。 比如我们例子中的84亿条sha256都不能存储,可以转换成840亿条长度为1000万的Sha链。 如果你对彩虹手表的工作原理感兴趣,可以阅读它的维基百科。 网上什至有一些计算出来的彩虹表可以直接使用,所以直接存储用户密码的sha256是非常不安全的。

如何避免彩虹表攻击?

简单的说就是加了盐。 通常,用户密码是一个字符串。 key 和 salt 是我们生成的字符串。 最初我们保存了key的哈希值hash(key)。 现在我们保存Key和salt的哈希值hash(Key+salt)。 这样,黑客生成的彩虹表就全部失效了。

如何生成salt,随机生成一个字符串?

这是个好问题。 加盐是不安全的。 盐的形成有很多问题。

比特币原理与挖矿算法_比特币采用的哈希算法是_比特币哈希值怎么查

Csprng不同于普通的随机数生成算法,比如C语言标准库中的rand()方法。 顾名思义,csprng 是加密安全的,这意味着它生成的随机数更加随机且不可预测。 Csprng 以通用编程语言提供,如下表所示:

算法

考虑查找表和彩虹表的原理。 如果salt很短,说明password和salt组成的字符串的长度和取值空间是有限的。 黑客可以为密码和盐的所有组合创建彩虹表。

如果所有用户的密码都用相同的盐加密。 无论盐多复杂多长,黑客都可以很容易地利用这个固定盐重建彩虹表,破解所有用户的密码。 如果您说我可以保存固定盐,这样就没人知道了,那么您应该重新阅读我的回答:为什么 AES 加密不够安全。 即使为每个用户生成一个随机盐,安全性仍然不够,因为盐在用户更改密码时被重复使用。 每次需要保存新密码时,都应该生成一个新的盐并用加密的哈希值保存。 注意:某些系统使用不同的字段、uid、手机号码或任何内容为每个用户加密密码。 这不是一个好主意,它几乎违反了上述三个加盐规则。

然后我设计了一个黑客不知道的哈希算法,所以你的破解方法是无效的。

可能不会。 首先,如果您不是密码学专家,设计一个安全的散列算法是非常困难的。 如果你不相信我,你可以再次阅读我对密码哈希的描述,并思考如何设计一个满足其所有四个属性的算法。 即使是在已有的密码哈希的基础上进行设计,也很难保证设计完成后新算法仍然满足密码哈希的要求。 一旦你的算法不符合安全要求,那么你就为黑客提供了更简单的破解用户密码的方法。 即使您可以设计出一种其他人都不知道的加密哈希算法,您也不能保证黑客永远不会知道您的算法。 黑客通常可以访问您的代码。 想想基尔霍夫原理或香农公里:

比特币哈希值怎么查_比特币采用的哈希算法是_比特币原理与挖矿算法

即使每个人都知道系统的操作步骤,密码系统也应该是安全的。

为每个密码添加不同的高质量盐,对其进行哈希处理并保存。 我可以?

它曾经是,但现在不是了。 随着计算机硬件的飞速发展,现代通用CPU可以以每月数百万次的速度计算SHA256,GPU集群计算可达每秒10亿次以上。 这使得暴力破解密码成为可能。 黑客不再依赖查找表或彩虹表,而是使用定制硬件和特殊算法,直接计算每一种可能性,实时破解用户密码。 我该怎么办?回想上面对加密哈希属性的描述

给定任何大小和任何类别的输入,计算哈希非常快

密码哈希不是为加密密码而设计的。 它的快速计算特性在其他应用场景中非常有用。 但是在目前的计算机硬件条件下,并不适合对密码进行加密。 为了解决这个问题,密码学家设计了一些哈希算法,如pbkdf2、bcrypt、scrypt等,用于对密码进行加密,称为密码哈希。 在他们的算法中,通常需要多次计算加密的哈希值,从而降低了哈希值的计算速度,增加了黑客暴力破解的成本。 可以说,密码哈希有一个设计原则,即计算过程可以根据需要减慢,不能轻易通过硬件加速。

应该使用哪个密码散列?

比特币哈希值怎么查_比特币采用的哈希算法是_比特币原理与挖矿算法

Pbkdf2、bcrypt 和 scrypt 曾经是最常用的三种加密哈希算法。 至于哪种算法最好,多年来密码学家一直没有定论。 但可以肯定的是,这三种算法都不是完美的,每种算法都有自己的不足。 GPU/ASIC 可以加速 Pbkdf2,因为它需要更少的内存。 bcrypt不支持内存调整,容易被FPGA加速,而scrypt不支持独立内存调整和计算时间占用,可能被ASIC加速,可能被side channels攻击。 2013年,美国国家标准技术研究院(NIST)邀请部分密码学家举办密码哈希竞赛,旨在寻找加密密码的标准哈希算法,并在业界宣传用户密码加密和存储的重要性。 竞争对手列出了对该算法的可能攻击:

最终,在 2015 年 7 月,argon2 算法赢得了比赛,被 NIST 评为最佳密码哈希算法。 但是,由于新算法的原因,我们还没有听说过任何大公司使用argon2来进行密码加密。

我一路累了。 能举个大公司如何加密用户密码的例子吗?

今年(2016 年),Dropbox 发生了部分用户密码数据泄露事件。 当时,其首席技术官表示,他们对加密密码的方式非常有信心。 不要担心。 随后,Dropbox 在其官方技术博客上发表了一篇名为《Dropbox 如何安全存储密码》的文章,描述了他们对用户密码的加密存储方案。

算法

如上图所示,Dropbox首先对用户的密码进行SHA512哈希,将密码转换为64字节比特币采用的哈希算法是,然后使用bcrypt算法计算SHA512的结果(每个用户独立salt,强度为10)。 最后使用AES算法和全局唯一密钥对bcrypt算法的计算结果进行加密保存。 在博客文章中,Dropbox 描述了这三层加密的原因: