这是我参与「第五届青训营 」伴学笔记创作活动的第14天
上次写过了密码加密中的加密传输, 现在通过数字证书等方式保证传输过程的可靠性
这次来讲加密存储
加密存储
在做本科毕设时, 写过一个论坛项目, 当时对密码加密没有概念, 使用的就是本地明文存储, 后来有次实习面试, 被面试官问"你这个论坛项目密码是怎么加密的呢?", 然后就原形毕露, 暴露了自己的无知, 这次青训营大项目, 正好补足了这方面的不足.
Hash加密
Hash加密算法属于一种单向加密算法, 比较常见的Hash加密算法有MD5和SHA系列
单向加密主要是由于hash的不唯一性, 导致很难从hash结果去复原文本
MD5
MD5全称为Message Digest Algorithm 5, 即消息摘要算法5
MD5将输入的不定长度文本信息, 经过一定的hash算法, 输出一个128位的散列值, 通常可以表示位32位的16进制数字
当文本信息发生一些微小的变动时, hash结果便会发生很大变化
图片来源于wiki
MD5算法主要的用途是用来保证消息一致性, 而非对消息进行加密, 因为MD5本质上还是一种hash算法, 既然是hash算法, 就会发生hash碰撞, 只不过发生hash碰撞的概率非常低, 但是信息安全实验室2009年发布了一篇文章, 表明需要2^{20.96}的碰撞算法复杂度, 即可破解MD5的碰撞抵抗
去年和同学参加数学建模大赛, 赛方要求提前将文章用MD5工具进行加密, 过几天再上传文章, 这里主要就是用MD5来保证信息一致性, 虽然存在本破解的可能, 不过概率非常小, 所以可以经常用来确保信息一致性
如果仅仅使用MD5这种Hash算法进行密码加密, 就算黑客并没有猜中用户密码, 但是通过猜测其他文本, 得出和密码一致的hash结果, 就算是猜中了一个用户密码, 所以使用这种算法来进行密码加密, 并不安全
SHA
讲完了MD5, 再来看SHA就比较容易
SHA算法主要包括SHA-1, SHA-2系列和SHA-3, 其中SHA-1是MD5的后继者, 并且已经于2017年被破解, 详见shattered
SHA-2主要包括SHA-224、SHA-256、SHA-384、SHA-512、SHA-512/224、SHA-512/256等, 目前还没有破解, 但是他的思想和SHA-1类似, 所以迟早有被破解的一天
SHA-3是2015年发布的最新的hash加密算法, 还没有被破解的苗头
加盐
指在散列之前将散列内容(例如:密码)的任意固定位置插入特定的字符串。这个在散列中加入字符串的方式称为“加盐”。其作用是让加盐后的散列结果和没有加盐的结果不相同,在不同的应用情景中,这个处理可以增加额外的安全性。
在大部分情况,盐是不需要保密的。盐可以是随机产生的字符串,其插入的位置可以也是随意而定。如果这个散列结果在将来需要进行验证(例如:验证用户输入的密码),则需要将已使用的盐记录下来。