概述
在一次 http 请求中,前后端如何安全地传输密码呢?服务器端如何安全存储密码呢?
一、明文传输、存储
1、大致步骤
客户端:用户注册、登录时,密码明文传输。
服务器:用户注册时,明文存储密码;
用户登录时,①读取数据库中密码,②与接收的密码进行比较以验证登录。
2、优缺点
没任何安全性可言,裸奔密码。请求被抓包,密码即暴露;数据库泄露,密码即暴露。
二、单向哈希后传输、存储
1、大致步骤
客户端:注册账号或登录时,密码经单向哈希后再发送给服务器。
服务器:用户注册时,存储哈希值;
用户登录时,①读取数据库中哈希值,②与接收的哈希值进行比较以验证登录。
2、优缺点
相比明文传输、存储,这个方式有了最基础安全防范。但密码的单向哈希,且存储时未加盐。密码容易被暴力穷举检索出来,如彩虹表攻击。现在主流的彩虹表都是100G以上了。
三、加盐存储
1、大致步骤
客户端:注册账号或登录时,密码经单向哈希后再发送给服务器。
服务器:用户注册时,①生成随机盐,加入到接收的哈希值中,经单向哈希后生成哈希值2;②存储盐值、哈希值2;
用户登录时,①读取数据库中盐值,加入到接收的哈希值中,经单向哈希后生成哈希值2;②与库中哈希值2进行比较以验证登录。
2、优缺点
密码加盐可以有效地防止彩虹表攻击。即使攻击者知道了盐的内容和加盐的位置,加盐仍然大大增加了利用彩虹表攻击的难度。
这种方式的优点是,即使数据库泄露,密码仍然具有一定的安全性。
缺点:多次请求,传输的哈希值总是固定的,并没有“加盐”保护。由于http请求的特性,不能直接对密码“加盐”,需要引入非对称加密。
四、非对称加密后传输后,加盐存储
基础版
1、大致步骤
客户端:注册账号或登录时,①生成随机值;②密码经单向哈希后,与生成的随机值一起,经公钥加密后,③将密文发送给服务器。
服务器:用户注册时,①使用私钥解密密文,丢掉随机值,得到哈希值;②生成随机盐,加入到哈希值中,经单向哈希后生成哈希值2;③存储盐值、哈希值2;
用户登录时,①使用私钥解密密文,丢掉随机值,得到哈希值;②读取数据库中盐值,加入到哈希值中,经单向哈希后生成哈希值2;③与库中哈希值2进行比较以验证登录。
2、优缺点
引入随机值,每次传输的密文不同。但RSA加密对于其加密的明文的长度有限制。同时,非对称加解密需要一些开销。另外,还需要维护公钥。
改进版
1、大致步骤
客户端:注册账号或登录时,①随机生成对称加密密钥;②密码经单向哈希后,进行对称加密,生成密文;③随机生成的对称加密密钥经公钥加密后,生成签名;④将密文、签名一起发送给服务器。
服务器:用户注册时,①使用私钥解密签名,得到对称加密密钥;②使用对称密钥解密密文,得到哈希值;③生成随机盐,加入到哈希值中,经单向哈希后生成哈希值2;④存储盐值、哈希值2;
用户登录时,①使用私钥解密签名,得到对称加密密钥;②使用对称密钥解密密文,得到哈希值;③读取数据库中盐值,加入到哈希值中,经单向哈希后生成哈希值2;④与库中哈希值2进行比较以验证登录。
2、优缺点
此方式虽然仍需要维护公钥,但传输的数据将不再有限制(即使是https,也需要付出维护公钥的成本)。
缺点是:开销进一步加大。
3.题外话
可将要传输的“密码的哈希值”换成任何你想要的数据,以达到安全传输数据的目的。
此方式为https的雏形,区别在于:①此方式并不验证公钥,②签名和加密后数据一起被发送到服务器,③用于加密数据的“对称加密的密钥”此后不再使用。
而 https 通过2次请求完成对公钥的验证以及对“对称加密的密钥”的约定,之后才发送数据,且继续使用密钥:
(1)第二次请求:服务器返回含公钥的证书;客户端验证证书(与本地的证书进行比较),决定是否发起第二次请求;
(2)第二次请求:客户端使用公钥加密“对称加密的密钥”,再发送给服务器。
——后续的请求与返回,使用约定好的对称加密的密钥来加密要传输的数据【将继续使用对称加密】
六、总结
对用户名和密码的验证,是其他登录方式的基础。
七、其他
如有错漏,欢迎指正。
标签:加密,登录,单向,密码,密钥,哈希 From: https://www.cnblogs.com/jmllc/p/17809081.html