ssl/hash/彩虹攻击/jwt/token,常见网络安全问题及策略概述

声明: 概述性博文, 附各主题中感觉写的比较清晰的博文链接.

SSL/TLS

从一开始的http到安全的https, 区别在于加了SSL协议. 关于证书:

  1. server生成pubic key和private key, 简称pubKey和priKey

  2. server向CA申请证书, 将pubKey和自己的相关信息发送给CA机构. CA机构用自己的CAprivateKey进行签名, 并将签名返回给server, server保存之

  3. CA的公钥是公布的, 保存在浏览器里.

  4. client可以通过使用CA的公钥对server的证书进行验证, 可以确信这个证书确实是经过CA认证的.
    SSL其他密钥交换详细过程参考: https://blog.csdn.net/alinyua/article/details/79476365

用户密码加密

有了https固然有一定的安全性, 因为双方所有的谈话都是加密的. 但是仅仅是谈话过程不会被窃取是不构的, 像密码这样的信息如果在浏览器或者服务器上以明问形式存储, 攻击者一旦攻克, 就可能直接获取了用户的密码.
因此必须有一种措施: 密码不以明文形式存在, 这就是密码的加密.
通常情况下:

  1. 客户端保存密码的hash值(此处命名为"ha"), 这只是一种微弱的保护, 因为如果知道了ha, 破解只需要得到字典, 如果是一般的密码网上可下载的字典中就可能包含了, 当然如果用户足够心机可能需要非常大的字典甚至暴力破解.(我甚至怀疑, 攻击者直接模拟一个登陆请求并将ha上传即可, 破解ha不需要)

  2. 服务器收到这个ha, 然后随机生成一个盐值(sault), 对这个ha加盐后再进行一次hash(生成的值此处命名为hb=hash(ha+sault)), 数据库中存放的是sault和hb. 之所以这么做是为了防止彩虹攻击. 彩虹攻击也是一种字典攻击. 攻击者在获取数据库数据后, 如果没有这个加盐操作, 攻击者只需要一个字典就可以破解所有密码(或者大量的密码). 但是如果加了盐值, 攻击者需要首先还原ha, 但是正由于加了盐值, hb毫无规律可言, 完全可能超出了彩虹表的范围.(彩虹表中的密码可能是常用的或者其他网站上已破解的那种), 而暴力破解基本是不可能的, 所以要想破解只有一个方法: 针对这个盐值重新构造一个字典. 也就说每要破解一个hb, 都需要重新构造字典. 这样的工作量emmm攻击者表示: 你魔鬼吧!

jwt token和cookie

​ 用户登陆后, 不可能访问server都传输用户名密码, 而http又是无连接的, 因此需要约定一种能代表用户信息的东西, 登陆之后只需要传输这个东西就能代表一个用户. 最一开始使用的是cookie. server创建一个session, 并将sessionId返回给client, client将其保存为cookie, 每次请求该server时都将带有这个cookie.
但是cookie模式有几个问题:

  1. server存放session量达到一定的规模后, 会造成巨大的负担(session是存在内存中的, 就算借助redis也是一种不可忽略的开销)
  2. 在分布式模型中, 由于session只存在于登陆的那个server, 因此如果client要访问其他server, 存储的那个cookie是无效的.(无法解决跨域访问)
  3. CSRF攻击: 攻击者写一个html文件, 其中有:<script src="http://www.bank.com/transport?amount=100000&to=attacker">(访问银行转账链接,向attacker转账100000)

而jwt( json web token)可以很好的解决这些问题

  1. 用户给出用户名密码, 服务器验证通过后
    生成:

    1. header, 包含签名算法
    2. payload, 用户名等非秘密信息(但代表了这个用户)+当前时间+token有效时间
    3. signature, 使用header中指定的算法
      String signature = HMACSHA512(base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
      
      将token = base64UrlEncode(header).base64UrlEncode(payload).signature 返回给客户端
  2. 客户端每次请求时需要携带这个信息, 服务器使用header指定的算法和本地存储的盐值对header和payload进行加密(实际是一种摘要算法不可逆),再与signature进行对比服务器通过payload中的信息知道: 某用户在某时间登陆过; 通过signature知道: payload信息不是造假的(因为盐值只有服务器知道)

  3. 防止CSRF: 因为cookie在登陆后, 每次请求服务器都会携带, 攻击者可以在不知道cookie的情况下让客户端向服务器发送[攻击者伪造的请求],详解:https://blog.csdn.net/xiaoxinshuaiga/article/details/80766369, 但是token必须手动添加, 要想向服务器发送请求必须是本地直接发起. 比如get请求: 客户端可以有: <a href="xxxx?token=xxx">, 但攻击者无法让客户端发起这个请求, 因为攻击者不知道这个token值. 也就无法进行类似: <script src="http://www.bank.com/transport?amount=100000&to=attacker"> 的攻击.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值