蛙蛙推荐:WEB安全入门

信息安全基础

信息安全目标html

  1. 真实性:对信息的来源进行判断,能对伪造来源的信息予以鉴别, 就是身份认证。
  2. 保密性:保证机密信息不被窃听,盗取,或窃听者不能了解信息的真实含义。
  3. 完整性:保证数据的一致性,防止数据被非法用户篡改或部分丢失。
  4. 可用性:保证合法用户对信息和资源的使用不会被不正当地拒绝。
  5. 不可抵赖性:创建有效的责任机制,防止用户否定其行为。

常见攻击手段git

  1. 破坏信息的完整性,篡改信息
  2. 拒绝服务
  3. 窃听,拦截信息
  4. 假冒
  5. 抵赖
  6. 重放
  7. 猜想预测
  8. 拖库, 信息泄露

密码学基础

HASHgithub

  1. 介绍
    1. 摘要性,把任意大小的数据映射成固定长大小的摘要信息,不一样信息有不一样的哈希值。
    2. 不可逆性,经过hash值不能反推出原始数据。
  2. 用途:
    1. 防止信息被篡改
    2. 保证信息完整性
    3. 数据去重
  3. 常见算法:
    1. checksum: 就是简单的总和校验码,通常在通讯中用于保证数据的完整性和准确性,好比tcp协议。
    2. crc32:32bit,性能好,碰撞率高,通常用于图片去重。
    3. md5: 128bit,通常用户密码加密,文件校验,对于密码加密已经不安全,由于已经找到了碰撞条件
    4. sha1: 基本同md5, 已经找到了碰撞条件, 但用于文件校验仍是没问题的
    5. sha256: 相对安全,能够用于密码加密
    6. Bloom Filter: 多个hash函数组合进行去重,通常用于大数据量的去重,好比搜索引擎网页收录。 若是它说一个项目不在一个集合里,那确定不在,若是说在,那有很小的可能不在。

随机数web

  1. 介绍
    1. 指定一个范围和种子,随机的生成一个数字
  2. 用途:
    1. 防猜想预测,让黑客猜想不到信息地址或加密因子。
    2. 防止重放,每次请求里的随机数不一致,用户重放请求时随机数已被使用而拒绝请求。
    3. Hash里看成salt,让相同的明文加盐后生成不一样的hash值,防止被人用字典攻击破解密码。
    4. 加密算法中看成iv(初始化向量),让相同的明文块生成不一样的密文,增长破解难度。
    5. 从集合里随机抽取数据,保证一段时间内惟一,好比tcp的seq。
    6. 动态口令,和时间,种子相关的随机数。
  3. 经常使用算法:
    1. 线性同余: 最经常使用的伪随机数生成算法,若是知道种子有可能被预测到。
    2. GUID: 全球惟一字符串,很难被猜想到。

对称加密算法

  1. 介绍:加密和解密须要使用相同的密钥,有流加密和块加密之分,通常能够进行大数据量的加密。
  2. 用途:
    1. 防止信息泄露
    2. 防止信息拦截
  3. 常见算法:
    1. DES: 64bit密钥, 破解难度较低
    2. 3DES: 三重DES,128bit密钥,破解难度较高
    3. RC2: DES的建议替代算法, 密钥长度可变,1-128bit, 速度较快
    4. RC4: 强度高,速度快, 不安全
    5. AES: 普遍使用的加密算法,速度快,安全级别高,已经成为美国加密标准, 目前 AES 标准的一个实现是 Rijndael 算法

非对称加密数据库

  1. 介绍:
    1. 加密和解密使用不一样的密钥,通常只能加密不多量的数据,并且性能较差。
    2. 公钥能够公开,公钥加密的数据私钥能够解密,反之也是。
    3. 私钥须要秘密保管,私钥签名的数据,公钥能够验证签名。
    4. 非对称加密算法的保密性比较好,它消除了最终用户交换密钥的须要。
  2. 用途:
    1. 验证身份,数字签名, 能够解决否定、伪造、篡改及冒充等问题
    2. 数据加密, 防止信息泄露和拦截
  3. 常见算法:
    1. RSA: 基于大数运算和数学原理,可让加密和解密使用不一样的密钥。
    2. DSA: 数据签名算法,

身份认证方案

HTTP基本认证数组

  1. 介绍:用户名追加一个冒号而后串接上口令,并将得出的结果字符串再用Base64算法编码。
  2. 优势:
    1. 浏览器支持普遍。
  3. 缺点:
    1. 不能防止信息泄露,base64只是编码,不是加密。
    2. 不能防窃听
    3. 不能防重放
    4. 不能防拖库
  4. 使用场景:
    1. 在可信网络环境中可以使用基本认证。
    2. 使用HTTPS作传输层。

HMAC浏览器

  1. 介绍:
    1. 用哈希算法,以一个密钥和一个消息为输入,生成一个消息摘要做为输出。
    2. 消息认证码是基于密钥和消息摘要【hash】所得到的一个值,可用于数据源发认证和完整性校验。
  2. 原理:
    1. 图
    2. client要给server发送message,先用key和message加起来,而后哈希得出一个MAC
    3. 而后用户把明文message和MAC发给server
    4. server知道key,用一样的算法获得MAC,看和client请求的MAC是否一致
    5. 若是MAC一致,说明message是拥有key的人发送的,并且message没有被篡改
  3. 优势:
    1. 实现了身份认证,实现了不可抵赖性
    2. 保证了数据完整性,达到了防篡改的效果
    3. HMAC与通常的加密重要的区别在于它具备“瞬时”性,即认证只在当时有效
  4. 缺点:
    1. message是明文,不能防窃听
    2. 不能防重放
  5. 应用:
    1. 挑战/响应(Challenge/Response)身份认证,如SIP,HTTP
    2. Cookie签名

HTTP摘要认证(Digest access authentication, rfc2069)安全

  1. 介绍
    1. 它在密码发出前,先对其应用哈希函数,这相对于HTTP基本认证发送明文而言,更安全。
    2. 图
  2. 原理
    1. client请求认证页面, 不提供用户名和密码
    2. server返回401应答
      1. realm:认证域, 明文,
      2. nonce: 随机数, 明文,只使用一次
    3. client再次发起请求
      1. 对用户名、认证域(realm)以及密码的合并值计算 MD5 哈希值,结果称为 HA1。
      2. 对HTTP方法以及URI的摘要的合并值计算 MD5 哈希值,例如,"GET" 和 "/dir/index.html",结果称为 HA2。
      3. 对 HA一、服务器密码随机数(nonce)、请求计数(nc,防止重放)、客户端密码随机数(cnonce)、 HA2 的合并值计算 MD5获得response 值以及cnonce。
    4. server收到应答,由于服务器拥有与客户端一样的信息,所以服务器能够进行一样的计算,以验证客户端提交的 response 值的正确性。
  3. 优势
    1. 密码明文不须要传输,因此明文不会被泄露,这样server能够不存明文密码,而是只存HA1。
    2. 能够客户端随机数cnonce,够防止选择明文攻击(劫持到密文后猜想加密算法及明文)。
    3. nonce容许包含时间戳, 过时后就失效,防止重放攻击。
    4. 服务器也能够维护一个最近发出的nonce的列表以防止nonce重用。
    5. 防监听,防重放, 防抵赖,身份认证
  4. 缺点
    1. RFC 2617 中的许多安全选项都是可选的, 某些时候会降级为RFC 2616。
    2. 容易受到中间人攻击, 摘要访问认证没有提供任何机制帮助客户端验证服务器的身份。
    3. 使用HTTPS加密同时使用这些弱明文协议解决了许多摘要访问认证试图要防止的许多威胁。
    4. 使用md5是使用到了md5的不可逆性,但md5如今有能够攻击的方式,如穷举攻击(密码比较简单时),字典攻击,
    5. 如何面对冲突攻击(不一样明文哈希后相同)(rfc2617)。
  5. 其它说明
    1. 能够容许每个nonce只使用一次,但这样就会迫使客户端在发送每一个请求的时候重复认证过程
    2. nonce在生成后马上过时是不行的,由于客户端将没有任何机会来使用这个nonce。
    3. 客户端屡次请求能够重用nonce,但得提供新的cnonce。在后续的请求中,nc比前一次要大。

https/tls服务器

  1. 介绍:它是一个安全传输协议,但也能够进行身份认证。
    1. 加密传输数据: 服务端和客户端之间的全部通信,都是加密的。
    2. 用于身份验证: 保证服务器就是他声称的服务器。
    3. 维护数据的完整性,确保数据在传输过程当中不被改变。
    4. RC4, X509
  2. 握手机制-简化版
    1. client要访问一个server, 知道server的域名domain
    2. client向server发起请求 2.1. ssl版本号 2.2. 加密算法类型 2.3. 随机数
    3. server给client返回应答 3.1 ssl版本号 3.2 加密算法类型 3.3 随机数 3.4 本身的证书(公钥) 3.5 随机数签名。
    4. client验证服务端返回的应答 4.1 证书是否过时 4.2 发型证书的CA是否可靠(会和本地的可信任CA列表对比) 4.3 server的公钥可否解开server返回的随机数签名 # 确认server有该证书的私钥 4.4 server的证书受权的域名是不是server的域名
    5. client随机产生一个用于对称加密密钥,而后用server的公钥加密,发给Server
    6. server用本身三私钥解密出对称加密密钥。
    7. 后续的通讯都用对称加密密钥进行加解密。
  3. 优势:
    1. 防窃听
    2. 防重放
    3. 防中间人攻击,
    4. 保证数据完整性性
    5. 防止会话劫持
  4. 缺点
    1. 不能防止信息泄露,拖库,只是保证传输层安全
    2. 通常不能用于客户端身份验证,须要配合http基本认证
    3. 创建链接速度慢

oauth

  1. 介绍:OAuth容许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每个令牌受权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内访问特定的资源(例如仅仅是某一相册中的视频)。
  2. 原理:
    1. 用户访问客户端的网站,想操做本身存放在服务提供方的资源。
    2. 客户端向服务提供方请求一个临时令牌。
    3. 服务提供方验证客户端的身份后,授予一个临时令牌。
    4. 客户端得到临时令牌后,将用户引导至服务提供方的受权页面请求用户受权。在这个过程当中将临时令牌和客户端的回调链接发送给服务提供方。
    5. 用户在服务提供方的网页上输入用户名和密码,而后受权该客户端访问所请求的资源。
    6. 受权成功后,服务提供方引导用户返回客户端的网页。
    7. 客户端根据临时令牌从服务提供方那里获取访问令牌 。
    8. 服务提供方根据临时令牌和用户的受权状况授予客户端访问令牌。
    9. 客户端使用获取的访问令牌访问存放在服务提供方上的受保护的资源。

双因素认证,动态口令

  1. 介绍: 1.简单来讲,双因素身份认证就是经过你所知道再加上你所能拥有的这二个要素组合到一块儿才能发挥做用的身份认证系统, 如ATM。
    1. 目前主流的双因素认证系统是基于时间同步型,
    2. 市场占有率高的有DKEY双因素认证系统、RSA双因素认证系统等
    3. 主流的有硬件令牌、手机短信密码、USB KEY、混合型令牌(USBKEY+动态口令), 密保卡,手机令牌
  2. 优势
    1. 密码丢失后,黑客不能登陆你的帐户
  3. 缺点
    1. 使用不方便

用密钥加密用户密码

  1. 介绍:
    1. 本机生成一个密钥key存磁盘上,对称加密密钥。
    2. 建立用户时,用户提供password, 而后数据库里保存db_password = encrypt(key, hash(password))
    3. 这样黑客把数据库拖走后,由于没有key解开用db_password,因此用户密码仍是安全的。
    4. 用户登陆时提供密码password, 哈希后是hash(password), 而后uncrypt(key, db_password),
      1. 二者比较,一致就是认证经过
      2. 不一致就是终止认证
  2. 优势:
    1. 防止拖库
  3. 缺点
    1. key丢了就完蛋了,谁也登陆不上了。

Secure Remote Password protocol

  1. 介绍

    1. 一个认证和密钥交换系统,它用来在不可靠的网络中保护口令和交换密钥。
    2. 经过消除了在网络上发送明文口令的须要,而且经过安全的密钥交换机制来使用加密,改进了安全性。
    3. 服务器不保存密码或密码的散列值, 防止字典攻击. 而只是保存验证因子(verifier).
    4. 客户端和服务器能够各自计算出一个会话秘钥(session key), 其值相同. 防止窃听和会话劫持.
    5. 好多游戏服务端用SRP认证,好比魔兽世界。
  2. 优势

    1. 防窃听
    2. 防暴力破解,字典攻击, 弱口令也不容易被破解
    3. 即便口令数据库被公之于众,攻击者仍然须要一个庞大的字典去搜索来得到口令。
    4. 速度快,不须要证书和第三方认证机构
  3. 缺点

    1. 浏览器不支持,得本身实现

原理

N     一个安全的大质数, 好比N=2q+1,q 是一个素数
g     一个以N为模的生成元,对任何X,有0 < X < N,存在一个值x,使得g^x % N == X。
k     k = H(N,G) 在 SRP6 中 k = 3
s     User’s Salt
I     用户名
p     明文密码
H()   单向 hash 函数
^     求幂运算
u     随机数
a,b   保密的临时数字
A,B   公开的临时数字
x     私有密匙(从 p 和 s 计算得来)
v     密码验证数字

N和g的值必须由双方讨论来达成一致。它们能够被提早设置好,或者主机把它们发送给客户端。

服务器存储以下信息
x = H(s, p)               (s is chosen randomly)
v = g^x                   (computes password verifier)

服务器的数据库保存 {I, s, v} 整个验证流程以下:

User -> Host:  I, A = g^a                  (标识本身是谁, a是随机数)
Host -> User:  s, B = kv + g^b             (把salt发送给user, b是随机数)

        Both:  u = H(A, B)

        User:  x = H(s, p)                 (用户输入密码)
        User:  S = (B - kg^x) ^ (a + ux)   (计算会话密钥)
        User:  K = H(S)

        Host:  S = (Av^u) ^ b              (计算会话密钥)
        Host:  K = H(S)

这样双方都有一个会话密钥S, 后续的消息传输能够用S作加解密,从而保证安全。
为了完成认证过程,双方还得向对方证实本身拥有正确的S,
S不能让第三方知道,因此不能直接传输给对方作比较,一个可能的办法是:

User -> Host:  M = H(H(N) xor H(g), H(I), s, A, B, K)
Host -> User:  H(A, M, K)

双方须要作以下保障
    1. 若是客户端收到B == 0 (mod N) 或u == 0, 客户端中止认证。
    2. 若是服务器发现 A == 0 (mod N)则中止认证。
    3. 用户必须得证实本身拥有正确的K,不然服务器就会终止认证。

相关连接

  1. HTTPS的七个误解(译文)
相关文章
相关标签/搜索