前言
常见的 web 项目中,往往都会有登录这一环节,就免不了密码的传输。如何更好的传输密码,是我经常思考的问题,所以正好看到有讨论这个问题的帖子,就简单整理下,顺便介绍下自己实际中使用的几种方式
文章连接:# 关于前后端密码传输与存储?
几种加密方式
帖子里,提问者列出了几种常见传输时加密情况:
- 前端加密,后端加密
- 前端加密,后端不加密
- 前端不加密,后端加密
- 前端不加密,后端不加密
除了第四种,另外三种应该是比较常见的模式了
一些讨论
- 密码不应当存储为明文或可逆加密的密文
- 前端加密会泄露加密方式
- 前端不加密,用
https
,后端也不加密,只保存hash
- 前端可逆加密,后端不可逆加密
- 后端数据加密是强制性的,否则无法通过公安备案
大多是方案 3,前端不加密,使用 https
这里补充一下加密算法和 hash 的区别:
加密算法:加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证
哈希算法:哈希算法不是加密算法,只是单向的,没有解密过程(有碰撞,但比较难)。哈希的作用是把一个更大空间上的数据映射到一个另一个(往往更小)的空间。所以又叫算指纹。
实际情况
简单看了几个常见网站的登录密码传输情况
知乎:提交时密码加密,但是输入后在控制台还可以在 input
标签的 value
里看到明确的值
掘金:提交时密码加密,控制台属性中不可见
qq 空间:登录页是 iframe,登录时通过 script 调用接口(具体方案可以看下,还挺有意思的), 前端密码加盐加密,控制台属性中不可见
可以看出,大多数网站还是对密码做了加密
自己了解的方式
-
前端加盐加密,后端加密存储
这个是和后端约定好的一种方式,前端使用
sha256
加盐的方式直接传输,后端直接用同样的盐加密存储 -
前端不加密,使用
https
传输 -
使用非对称加密(jsencrypt 库),通过接口获取公钥,然后用公钥加密传输
后端同时生成公钥,私钥,共钥传给前端用来加密,私钥用来接收后解密