日常登录各类网站或应用需输入账号和密码来进行身份验证,而密码作为身份验证之一,其工作原理是系统将用户输入密码与系统数据库中所存密码进行匹配,匹配通过则验证成功。因此如果他人从数据库数据中获取到用户密码(内部人员或数据库数据泄露),便可利用此用户账号和密码撞库攻击其他网站或应用(很多用户在不同网站或应用中使用同一套密码),造成一定的用户信息财产损失。那么密码在系统中是如何被处理保存在数据库中?又是如何防止数据库数据泄露而不导致密码泄露呢?这便需要系统对密码进行相关加密操作。
下面将从由简到难梳理密码在系统中加密方式及相关基本原理。
一、明文存储
明文存储即不对密码进行处理,直接存储至数据库中;匹配时直接将用户输入的密码字符串与数据库中的密码字符串进行比对,方便快捷;
明文存储存在严重的安全风险,有权限的内部人员登录数据库便可直接查看所有用户密码信息,黑客入侵数据库或数据库数据泄露也可直接查看相关信息;
二、对称加密
像日常生活中对贵重物品进行上锁保存一样,系统也可采用对密码进行加密处理来保存,可以在一定程度防止密码被泄露破解。最方便简便的加密方式是对称加密,即对信息的加密和解密操作是采用同一个密钥进行操作。例如凯撒密码(对英文字符串按字母顺序移动N位);而目前常见的对称加密方式是DES、3DES、AES;
因此密码对称加密的使用场景便可如下:例如密码可以采用DES算法加密后存储至数据库中,用户登录校验时则将数据库中存储的加密密码采用DES算法进行解密与用户输入的密码进行匹配,或者将用户输入的密码进行DES算法加密后与数据库中已加密的密码进行匹配。
以上采用密钥为十六进制编码的AAAABBBBCCCCDDDD、运算模式为CBC、填充方式为PKCS7的DES对称加密算法,加密网站:DES 加密/解密 - 锤子在线工具 (toolhelper.cn)
采用对称加密的密码数据,仍可采取暴力穷举或概率计算的方式进行破解。而密码的使用场景是匹配,可以无需对密码进行解密,只需保证用户输入密码能与数据库中所存密码字段进行匹配即可,便可采用哈希(Hash)
补充内容:
与对称加密相关的改变是非对称加密,即对信息的加密和解密操作并不采用同一个密钥,而是两种密钥:公钥和私钥;公钥用来信息加密、私钥用来信息解密;公钥对外公开,私钥保密;而非对称加密的基本数学原理参考: 李永乐老师11分钟讲RSA加密算法(2018最新);非对称加密的运算时间相比对称加密要长,其特性更多被用在数据通信中。目前常见的非对称加密方式是RSA、ECC;
三、哈希
哈希(Hash)以下定义来自百度百科:Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。
通过上述定义可总结:(1):相同数据经过哈希计算后得到的哈希值相同(2):经过哈希计算后,源数据的信息被损失掉,无法进行逆运算还原;(3):因为哈希值长度固定,源数据与哈希值的对应关系:N:1;理论上可以有无穷个源数据对应一个哈希值;目前常见哈希方法的哈希值长度在128字节以上,其散列区间大,且较好的散列性保证计算出两个不同源数据对应一个哈希值。
目前常见的哈希方法包含:MD5、SHA-1、SHA-2系列;
利用上述哈希值特性便可进行密码匹配,用户输入的密码字符串经过哈希计算后得到的哈希值与系统存储的哈希值进行匹配;因为哈希值无法逆还原,从而保证只有用户知道密码;加密网站:MD5 加密 - 锤子在线工具 (toolhelper.cn)
因为相同数据会产生同一个哈希值,上述源数据123456经过MD5计算出的128位的哈希值必然为“49ba59abbe56e057”;便可以建立一个常见密码的对应关系,即彩虹表;参考连接:算法高级(23)-彩虹表(Rainbow Table)_彩虹表下载-CSDN博客;将上述哈希值利用MD5破解网站:md5在线解密破解,md5解密加密 (cmd5.com)可得到密码为123456
如何解决该问题呢?可以给密码加点“盐(salt)”,增加匹配的计算难度。
哈希的其他常见应用场景:网盘文件秒传(文件的哈希值对比)、发布的应用防篡改(应用的哈希值对比)等
四、哈希加盐
何为“盐”,盐即是一段字符串;其使用方法是将“盐”与用户输入的密码进行拼接,再计算哈希进行存储;
加的“盐”可分为两种:(1)加“固定盐”,即所有用户的“盐值”相同,最简单的实现方式比如将用户输入的密码后面追加字符串“salt”,例如“123456salt”;(2)加“随机盐”,即不同用户使用的“盐值”不同;
加“固定盐”后不同用户输入的密码还是被转为相同字符串再哈希,其哈希值还是相同,被彩虹表攻击的可能性仍较高;且“固定盐”加后系统后续修改“盐”的成本较高;
加“随机盐”后不同用户输入的密码会被转为不同的字符串,得到的哈希值也不同,这便使利用彩虹表破解的难度大大增加;但需将“盐”进行数据库存储;
除加盐外,还可进行多次不同哈希来增加破解难度;
加盐用法的其他常见应用场景:例如网站注册账号重复时可以给自己的账号追加“盐”来提高注册成功率