聊一聊随机数安全
和朋友聊到一个比较有意思的现象,在最近两年的校招面试中,大部分同学连一点根底的暗码学知识都没有, 即便是有一些浸透功底的同学。
所以这儿想和咱们聊一些简略的暗码学根底知识,不触及算法完成,更多的是和常见的缝隙场景联络起来,让问题更简略了解,有点抛砖引玉的意思。
本文首要聊一下随机数,随机数其实是十分广泛的,能够说也是暗码技能的根底。
对随机数的运用不当很或许会导致一些比较严重的安全问题, 而且这些安全问题通常会比较荫蔽。
0x01 随机数
概述
随机数在计算机运用中运用的比较广泛,最为熟知的便是在暗码学中的运用。本文首要是解说随机数运用导致的一些Web安全风。
咱们先简略了解一下随机数
分类
随机数分为真随机数和伪随机数,咱们程序运用的底子都是伪随机数,其间伪随机又分为强伪随机数和弱伪随机数。
真随机数,经过物理试验得出,比方掷钱币、骰子、转轮、运用电子元件的噪音、核裂变等
伪随机数,经过必定算法和种子得出。软件完成的是伪随机数
强伪随机数,难以猜想的随机数
弱伪随机数,易于猜想的随机数
特性
随机数有3个特性,详细如下:
随机性:不存在统计学误差,是彻底凌乱的数列
不行猜想性:不能从曩昔的数列估测出下一个呈现的数
不行重现性:除非将数列自身保存下来,不然不能重现相同的数列
随机数的特性和随机数的分类有必定的联络,比方,弱伪随机数只需求满意随机性即可,而强位随机数需求满意随机性和不行猜想性,真随机数则需求一起满意3个特性。
引发安全问题的要害点在于不行猜想性。
伪随机数的生成
咱们往常软件和运用完成的都是伪随机数,所以本文的要点也便是伪随机数。
伪随机数的生成完成一般是算法+种子。
详细的伪随机数生成器PRNG一般有:
线性同余法
单向散列函数法
暗码法
ANSI X9.17
比较常用的一般是线性同余法,比方咱们熟知的C言语的rand库和Java的java.util.Random类,都采用了线性同余法生成随机数。
运用场景
随机数的运用场景比较广泛,以下是随机数常见的运用场景:
验证码生成
抽奖活动
UUID生成
SessionID生成
Token生成
CSRF Token
找回暗码Token
游戏(随机元素的生成)
洗牌
俄罗斯方块呈现特定形状的序列
游戏爆配备
暗码运用场景
生成密钥:对称暗码,音讯认证
生成密钥对:公钥暗码,数字签名
生成IV: 用于分组暗码的CBC,CFB和OFB形式
生成nonce: 用于防护重放进犯; 分组暗码的CTR形式
生成盐:用于依据口令的暗码PBE等
0x02 随机数的安全性
比较其他暗码技能,随机数很少遭到重视,但随机数在暗码技能和计算机运用中是十分重要的,不正确的运用随机数会导致一系列的安全问题。
随机数的安全危险
随机数导致的安全问题一般有两种
应该运用随机数,开发者并没有运用随机数;
应该运用强伪随机数,开发者运用了弱伪随机数。
第一种状况,简略来讲,便是咱们需求一个随机数,但是开发者没有运用随机数,而是指定了一个常量。当然,许多人会怒发冲冠的说,sb才会不必随机数。但是,请不要疏忽我朝仍是有许多的。首要有两个场景:
开发者缺少根底知识不知道要用随机数;
一些运用场景和结构,接口文档不完善或许开发者没有仔细阅读等原因。
比方找回暗码的token,需求一个伪随机数,许多事务直接依据用户名生成token;
比方OAuth2.0中需求第三方传递一个state参数作为CSRF Token避免CSRF进犯,许多开发者底子不运用这个参数,或许是传入一个固定的值。由于认证方无法对这个值进行事务层面有效性的校验,导致了OAuth的CSRF进犯。
第二种状况,首要差异就在于伪随机数的强弱了,大部分(一切?)言语的API文档中的根底库(常用库)中的random库都是弱伪随机,许多开发天然就直接运用。但是,最重要也最丧命的是,弱伪随机数是不能用于暗码技能的。
仍是第一种状况中的找回暗码场景,关于token的生成, 许多开发运用了时刻戳作为随机数(md5(时刻戳),md5(时刻戳+用户名)),但是由于时刻戳是能够猜想的,很简略就被猜解。不行猜想性是区别弱伪随机数和强伪随机数的要害目标。
当然,除了以上两种状况,还有一些比较特别的状况,通常状况下比较罕见,但是也不扫除:
种子的走漏,算法许多时分是揭露的,假如种子走漏了,相当于随机数现已走漏了;
随机数池缺乏。这个严格来说也归于弱伪随机数,由于随机数池缺乏其实也导致了随机数是可猜想的,进犯者能够直接暴力破解。
缝隙实例
wooyun上有许多缝隙,还蛮有意思的,都是和随机数有关的。
PS:个人实力有限,以下实例底子都来自wooyun缝隙实例,在这儿谢谢各位大牛,如有侵权,请联络删去。
1.应该运用随机数而未运用随机数
Oauth2.0的这个问题特别经典,除了wooyun实例列出来的,其实许多厂商都有这个问题。
Oauth2.0中state参数要求第三方运用的开发者传入一个CSRF Token(随机数),假如没有传入或许传入的不是随机数,会导致CSRF登陆恣意帐号:
唯品会账号相关缝隙可经过csrf登录恣意账号
人人网-百度OAuth 2.0 redirect_uir CSRF 缝隙
2.运用弱伪随机数
1) 暗码取回
许多暗码找回的场景,会发送给用户邮件一个url,中心包括一个token,这个token假如猜想,那么就能够找回其他用户的暗码。
1.Shopex 4.8.5暗码取回处新生成暗码可猜想缝隙
直接运用了时刻函数microtime()作为随机数,然后获取MD5的前6位。
1
substr(md5(print_r(microtime(),true)),0,6);
PHP 中microtime()的值除了当时服务器的秒数外,还有微秒数,奇妙数的改变范围在0.000000 -- 0.999999 之间,一般来说,服务器的时刻能够经过HTTP返回头的DATE字段来获取,因而咱们只需求遍历这1000000或许值即可。但咱们要运用暴力破解的方法建议1000000次网络恳求的话,网络恳求数也会十分之大。但是shopex十分交心的在生成暗码前再次将microtime() 输出了一次:
[1] [2] 黑客接单网