前后端密码的传输与存储

2021-09-28 21:04:40

前言

常见的 web 项目中,往往都会有登录这一环节,就免不了密码的传输。如何更好的传输密码,是我经常思考的问题,所以正好看到有讨论这个问题的帖子,就简单整理下,顺便介绍下自己实际中使用的几种方式

文章连接:# 关于前后端密码传输与存储?

几种加密方式

帖子里,提问者列出了几种常见传输时加密情况:

  1. 前端加密,后端加密
  2. 前端加密,后端不加密
  3. 前端不加密,后端加密
  4. 前端不加密,后端不加密

除了第四种,另外三种应该是比较常见的模式了

一些讨论

  1. 密码不应当存储为明文或可逆加密的密文
  2. 前端加密会泄露加密方式
  3. 前端不加密,用 https,后端也不加密,只保存 hash
  4. 前端可逆加密,后端不可逆加密
  5. 后端数据加密是强制性的,否则无法通过公安备案

大多是方案 3,前端不加密,使用 https

这里补充一下加密算法和 hash 的区别:

加密算法:加密算法是可逆的,用来对敏感数据进行保护。散列算法(签名算法、哈希算法)是不可逆的,主要用于身份验证

哈希算法:哈希算法不是加密算法,只是单向的,没有解密过程(有碰撞,但比较难)。哈希的作用是把一个更大空间上的数据映射到一个另一个(往往更小)的空间。所以又叫算指纹。

实际情况

简单看了几个常见网站的登录密码传输情况

知乎:提交时密码加密,但是输入后在控制台还可以在 input 标签的 value 里看到明确的值

掘金:提交时密码加密,控制台属性中不可见

qq 空间:登录页是 iframe,登录时通过 script 调用接口(具体方案可以看下,还挺有意思的), 前端密码加盐加密,控制台属性中不可见

可以看出,大多数网站还是对密码做了加密

自己了解的方式

  1. 前端加盐加密,后端加密存储

    这个是和后端约定好的一种方式,前端使用 sha256 加盐的方式直接传输,后端直接用同样的盐加密存储

  2. 前端不加密,使用 https 传输

  3. 使用非对称加密(jsencrypt 库),通过接口获取公钥,然后用公钥加密传输

    后端同时生成公钥,私钥,共钥传给前端用来加密,私钥用来接收后解密

参考链接