- 数据库被盗
- 服务器被入侵
- 通讯被窃听
- 内部人员盗取数据
- 严禁明文存储
- 单向变换
- 变换复杂度要求
- 密码复杂度要求
- 加盐提高密码复杂度
- https传输
- 频次限制
- 前端加密
-
两次或多次md5无法使加密更加可靠
-
不能只在数据库加盐,需要在后端代码里在定义常量盐,提高安全性,即使在数据库泄露之后,密码依旧无法反推
-
不能完全依靠加盐来保护密码,对于用户密码的输入也应该有复杂度要求
// 如果数据库里没有设定盐
// sql 表示数据库语句
// 去过没有盐 则生成一个盐,先用盐字段对密码加密, 再加到数据库的salt字段中
if (res.salt === null) {
const salt = Math.random() * 99999 + new Date().getTime()
res = await query(sql, [salt, encryptPassword(salt, password), username])
} else {
console.log('has salt')
// 有盐的情况直接进行操作
}
主要防止机器人之类恶意注册或者其他恶意请求
后端生成一个验证码图片,并把相应字符存在session中,并将图片发送给前端,在用户发送过来的时候对比验证码
和图片验证码类似,生成一张图片并随即抠图,记录下x,y的值,设定一些误差范围,将图片返回给前端。前端实现交互,当用户拖动结束时候,前端将x,y发送给后台,后台对比值是否正确
https & http 比http更加安全,http可能被黑客拦截,proxy到其他地址来误导用户, https = http + ssl证书 通过证书可以明确网站信息,增强网站可靠性
-
什么是ssl证书 SSL证书由浏览器中“受信任的根证书颁发机构”在验证服务器身份后颁发,具有网站身份验证和加密传输双重功能
-
https涉及到的密码学知识
- 对称加密 对称加密相当于加密和解密用同一把秘钥,发送人用秘钥加密,把密文发送给接收人,接收人用秘钥解密密文。这么做有一个极大的缺点就是,所有人共用一个秘钥,一旦任意一个人泄露了秘钥,就要重新更换秘钥,秘钥的传输,以及文件的安全都得不到保障,尤其在分布式开发的过程中,密钥的管理也是很大的问题。
- 非对称加密 非对称加密有一把公钥和一把密钥,发送人使用公钥加密发送密文,接收人用密钥解密密文。这样只要由个别人管理好密钥,即使公钥发生泄漏或者有其他问题,也不会导致文件有安全问题,在分布式开发中,也更好管理。并且非对称加密有极强的抗抵赖性和真实性,即能使用密钥解密的密文,一定是用公钥加密的,反之亦然。
-
https安全原理
- 服务器先把自己的网站相关信息以及公钥发送给相关部门,如赛门铁克(Symantec)等,他们验证以后会发给服务端一个证书,并保存公钥
- 客户端和服务器端经tcp三次握手,建立初步连接。
- 客户端发送http报文请求并协商使用哪种加密算法。
- 服务端响应报文并把自身的数字签名发给服务端。
- 客户端请求的时候,服务器把公钥和证书发给客户端。客户端拿到公钥和证书去和颁发中心去匹配认证,在认证成功之后,客户端生成一个对称秘钥,用服务器给的公钥加密自己的秘钥,并发送给服务器
- 服务器拿到密文之后,用秘钥解密,拿到客户端的秘钥,之后和客户端正常通信的时候就是用对称秘钥进行通信。
- TCP四次挥手,通信结束。