数据库储存html代码安全性 用户密码加密存储十大问答,一文讲解密码安全存储

点击上方“程序员大白”,选择“明星”公众号

重货,尽快送达

数据库储存html代码安全性_原本存储代码的工具_存储代码的网站

我们的数据库的权限管理是非常严格的。 即使是敏感信息的开发工程师也看不到。 以明文形式存储密码不是可以吗?

不。 数据库中存储的数据面临多种威胁,包括应用层、数据库层、操作系统层、机房层、员工层。 100% 防止被黑客窃取是非常困难的。

如果将密码加密然后存储,黑客即使将其拖入数据库也很难获取用户的明文密码。 可以说,密码加密存储是用户账户系统的底裤。 它的重要性相当于你独自旅行时缝在内衣里的钱。 虽然你不太可能使用它们,但它们可以在关键时刻挽救生命。

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

不。 这就涉及到如何保存用于加密和解密的密钥。 虽然密钥一般与用户信息分开存储,但业界也有一些成熟的基于软件或硬件的密钥存储方案。 但就像用户信息的存储一样,不可能100%防止密钥泄露。 通过这种方式对密码进行加密可以降低黑客获取明文密码的概率。 但一旦密钥泄露,用户的明文密码也会泄露,这不是一个好方法。

另外,用户账户系统不应该保存用户的明文密码,并且当用户忘记密码时,提供重置密码而不是找回密码的功能。

存储代码的网站_数据库储存html代码安全性_原本存储代码的工具

保存所有密码的HASH值,例如MD5。 够了吗?

并不是所有的HASH算法都可以使用。 准确来说,应该是 Cryptographic Hash。 密码哈希具有以下特点:

给定任何大小和类型的输入,计算哈希值都非常快;

给定一个哈希,没有办法计算出该哈希对应的输入;

对输入进行微小的改变,哈希值就会发生很大的变化;

无法计算具有相同哈希值的两个输入;

虽然它不是为加密密码而设计的,但其属性 2、3、4 使得加密哈希非常适合加密用户密码。 常见的加密哈希包括 MD5、SHA-1、SHA-2、SHA-3/Keccak 和 BLAKE2。

从 1976 年开始,业界开始使用 Cryptographic Hash 来加密用户密码,最早出现在 Unix Crypt 中。 不过MD5和SHA-1已经被破解,不再适合保存密码。

然后我保存用户密码的 SHA256 值。

不。 黑客可以使用查找表或彩虹表来破解用户密码。 请注意,破解密码并不是破解 SHA256。 基于SHA256的密码之所以能够被破解,是因为用户密码往往需要大脑记忆和手动输入,因此不会太复杂,而且往往有有限的长度和一定的取值空间。

例如,对于8位数字的密码,只有10^8=100000000种可能性。 一亿条数据并不算太多。 黑客可以提前计算出从0-99999999的所有sha256,并以sha256作为密钥密码作为值并将其存储为查询表。 当给定的sha256需要破解时,只需从表中查询即可。 。

存储代码的网站_数据库储存html代码安全性_原本存储代码的工具

例如,对于一个允许大小写数字和字母的10位密码,总共有(10+26+26)^10~=840亿种可能性。 记录太多,很难将它们全部保存在查找表中。 这时候黑客就会使用一种叫做彩虹表的技术来破解。 彩虹表使用了计算机世界中典型的问题解决思路,牺牲了时间和空间。 在这个例子中,没有足够的空间,所以要花更多的时间。 在彩虹表中,所有的sha256值都可以转换成多个相同长度的哈希链,并且只保存哈希链的头和尾。 破解时,首先查询sha256存在于哪条哈希链中,然后计算这条哈希链中的所有sha256,实时比较,从而破解用户密码。

原本存储代码的工具_数据库储存html代码安全性_存储代码的网站

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

实际的Hash链比上面的例子要长得多。 例如,在我们的例子中,840亿个SHA256全部无法存储,可以转换成840亿个长度为1000万的SHA链。 如果你对彩虹表的原理感兴趣,可以阅读它的维基百科。

网上甚至有一些计算彩虹表可以直接使用,所以直接保存用户密码的sha256是非常不安全的。

如何避免彩虹表攻击?

简单来说,就是加盐。 一般来说,用户密码是一个字符串key,salt是我们生成的字符串salt。 原来我们保存的是key的哈希值HASH(key)。 现在我们保存key和salt拼接在一起的哈希值HASH(key+salt)。

这样,黑客提前计算生成的彩虹表就会失效。

盐该如何产生? 随机生成一个字符串?

这是一个很好的问题。 加盐并不意味着它是安全的。 盐的生成过程中需要注意的事项有很多。

CSPRNG 与普通的随机数生成算法有很大不同,例如 C 语言标准库中的 rand() 方法。 顾名思义,CSPRNG 具有加密安全性,这意味着用它生成的随机数更加随机且不可预测。 常见的编程语言都提供CSPRNG,如下表所示:

编程语言 CSPRNG

C/C++

CryptGen随机

爪哇

Java.security.SecureRandom

PHP

mcrypt_create_iv

埃尔兰

地穴:strong_rand_bytes

Linux/Unix 上的任何编程语言

读取/dev/随机

存储代码的网站_原本存储代码的工具_数据库储存html代码安全性

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

如果所有用户的密码都使用相同的盐进行加密。 无论盐有多复杂、多长,黑客都可以轻松地使用这个固定盐来重新建立彩虹表并破解您所有用户的密码。 如果你说,我可以存储固定盐并向其他人隐藏它,那么你应该重新阅读我关于为什么使用 AES 加密不够安全的答案。

即使为每个用户生成随机盐,安全性仍然不够,因为当用户更改密码时盐会被重复使用。 每次需要保存新密码时,都应生成新的盐并将其与加密的哈希值一起存储。

注意:某些系统使用每个用户都不同的字段(例如 uid、电话号码或其他内容)来对密码加盐。 这不是一个好主意,并且违背了上述几乎所有三个盐生成规则。

那我就设计一个黑客不知道的HASH算法,让你所有的破解方法都失效。

不能。

首先,如果你不是密码学专家,你很难设计出安全的哈希算法。 如果你不相信,你可以再读一遍我对加密哈希的描述,然后思考如何设计一个能够满足其所有四个特性的算法。 即使基于现有的密码哈希进行设计,设计完成后也很难保证新算法仍然满足密码哈希的要求。 一旦你的算法不满足安全要求,那么你就为黑客提供了更多、更简单的方法来破解用户密码。

即使你可以设计出别人不知道的加密哈希算法,你也不能保证黑客永远不会知道你的算法。 黑客经常可以访问您的代码,想想柯霍夫原理或香农公里:

即使每个人都知道系统如何运行,加密系统也应该保持安全。

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

以前是可以的,但现在不行了。 计算机硬件正在迅速发展。 现代通用CPU每月可以计算sha256数百万次,GPU集群每秒可以计算sha256超过10亿次。 这使得暴力破解密码成为可能。 黑客不再依赖查找表或彩虹表,而是使用定制的硬件和专用算法直接计算每种可能性并实时破解用户密码。

那我们该怎么办呢? 回想一下上面对密码学哈希特性的描述,第一个:

给定任何大小或类型的输入,计算哈希值都非常快

加密哈希并不是为了加密密码而设计的。 其非常快的计算速度在其他应用场景中非常有用。 但在目前的计算机硬件条件下,用它来加密密码是不合适的。 针对这一点,密码学家设计了PBKDF2、BCRYPT、SCRYPT等Hash算法来加密密码,称为Password Hash。 在他们的算法中,密码哈希通常需要进行多次计算,从而减慢了哈希的计算速度,增加了黑客暴力破解的成本。 可以说,Password Hash有一个设计原则,就是计算过程可以根据需要减慢,并且不容易被硬件加速。

应使用哪个密码哈希?

PBKDF2、BCRYPT 和 SCRYPT 曾经是三种最常用的密码哈希算法。 至于哪种算法最好,密码学家多年来都没有定论。 但可以肯定的是,这三种算法都不是完美的,各有其缺点。 其中,PBKDF2可以通过GPU/ASIC加速,因为计算过程需要更少的内存。 BCRYPT不支持内存占用调整,很容易通过FPGA加速。 SCRYPT不支持独立调整内存或计算时间占用,可能通过ASIC加速,容易受到旁道攻击。 可能的。

2013年,NIST(美国国家标准与技术研究所)邀请一些密码学家举办密码哈希竞赛,旨在寻找一种用于加密密码的标准哈希算法。 教育业界了解用户密码加密存储的重要性。 竞赛列出了参赛算法可能面临的攻击方式:

最终,2015年7月数据库储存html代码安全性,Argon2算法赢得了比赛,并被NIST认可为最佳密码哈希算法。 不过数据库储存html代码安全性,由于该算法太新,我还没有听说有任何大公司使用 Argon2 进行密码加密。

我厌倦了一直问。 你能举例说明大公司如何加密用户密码吗?

今年(2016年),Dropbox遭遇了部分用户密码数据泄露的情况。 当时其CTO表示,他们对自己的密码加密方式非常有信心,并请用户放心。 随后,Dropbox在其官方技术博客上发表了一篇题为《Dropbox如何安全地存储你的密码》的文章,描述了他们的用户密码加密存储解决方案。

存储代码的网站_数据库储存html代码安全性_原本存储代码的工具

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

© 版权声明
THE END
喜欢就支持一下吧
点赞74赞赏 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容