密碼那些事

之前在工作中經(jīng)常用密鑰,但是不知道其中的原因祭玉,現(xiàn)在閑下來就來看下,再看的過程發(fā)現(xiàn)這個隨機(jī)數(shù)概念很模糊春畔,于是就查了下脱货,現(xiàn)總結(jié)如下:

 0x01 隨機(jī)數(shù)

  概述

  隨機(jī)數(shù)在計算機(jī)應(yīng)用中使用的比較廣泛,最為熟知的便是在密碼學(xué)中的應(yīng)用律姨。本文主要是講解隨機(jī)數(shù)使用導(dǎo)致的一些Web安全風(fēng)振峻。

  我們先簡單了解一下隨機(jī)數(shù)

  分類

  隨機(jī)數(shù)分為真隨機(jī)數(shù)和偽隨機(jī)數(shù),我們程序使用的基本都是偽隨機(jī)數(shù)择份,其中偽隨機(jī)又分為強(qiáng)偽隨機(jī)數(shù)和弱偽隨機(jī)數(shù)扣孟。

  真隨機(jī)數(shù),通過物理實驗得出缓淹,比如擲錢幣哈打、骰子塔逃、轉(zhuǎn)輪、使用電子元件的噪音料仗、核裂變等

  偽隨機(jī)數(shù)湾盗,通過一定算法和種子得出。軟件實現(xiàn)的是偽隨機(jī)數(shù)

  強(qiáng)偽隨機(jī)數(shù)立轧,難以預(yù)測的隨機(jī)數(shù)

  弱偽隨機(jī)數(shù)格粪,易于預(yù)測的隨機(jī)數(shù)

  特性

  隨機(jī)數(shù)有3個特性,具體如下:

  隨機(jī)性:不存在統(tǒng)計學(xué)偏差氛改,是完全雜亂的數(shù)列

  不可預(yù)測性:不能從過去的數(shù)列推測出下一個出現(xiàn)的數(shù)

  不可重現(xiàn)性:除非將數(shù)列本身保存下來帐萎,否則不能重現(xiàn)相同的數(shù)列

  隨機(jī)數(shù)的特性和隨機(jī)數(shù)的分類有一定的關(guān)系,比如胜卤,弱偽隨機(jī)數(shù)只需要滿足隨機(jī)性即可疆导,而強(qiáng)位隨機(jī)數(shù)需要滿足隨機(jī)性和不可預(yù)測性,真隨機(jī)數(shù)則需要同時滿足3個特性葛躏。

  引發(fā)安全問題的關(guān)鍵點在于不可預(yù)測性。

  偽隨機(jī)數(shù)的生成

  我們平常軟件和應(yīng)用實現(xiàn)的都是偽隨機(jī)數(shù)舰攒,所以本文的重點也就是偽隨機(jī)數(shù)败富。

  偽隨機(jī)數(shù)的生成實現(xiàn)一般是算法+種子摩窃。

  具體的偽隨機(jī)數(shù)生成器PRNG一般有:

  線性同余法

  單向散列函數(shù)法

  密碼法

  ANSI X9.17

  比較常用的一般是線性同余法,比如我們熟知的C語言的rand庫和Java的java.util.Random類猾愿,都采用了線性同余法生成隨機(jī)數(shù)。

  應(yīng)用場景

  隨機(jī)數(shù)的應(yīng)用場景比較廣泛匪蟀,以下是隨機(jī)數(shù)常見的應(yīng)用場景:

  驗證碼生成

  抽獎活動

  UUID生成

  SessionID生成

  Token生成

  CSRF Token

  找回密碼Token

(隨機(jī)元素的生成)

  洗牌

  俄羅斯方塊出現(xiàn)特定形狀的序列

  游戲爆裝備

  密碼應(yīng)用場景

  生成密鑰:對稱密碼,消息認(rèn)證

  生成密鑰對:公鑰密碼材彪,數(shù)字簽名

  生成IV: 用于分組密碼的CBC,CFB和OFB模式

  生成nonce: 用于防御重放攻擊; 分組密碼的CTR模式

  生成鹽:用于基于口令的密碼PBE等

  0x02 隨機(jī)數(shù)的安全性

  相比其他密碼技術(shù)段化,隨機(jī)數(shù)很少受到關(guān)注嘁捷,但隨機(jī)數(shù)在密碼技術(shù)和計算機(jī)應(yīng)用中是非常重要的,不正確的使用隨機(jī)數(shù)會導(dǎo)致一系列的安全問題显熏。

  隨機(jī)數(shù)的安全風(fēng)險

  隨機(jī)數(shù)導(dǎo)致的安全問題一般有兩種

  應(yīng)該使用隨機(jī)數(shù)雄嚣,開發(fā)者并沒有使用隨機(jī)數(shù);

  應(yīng)該使用強(qiáng)偽隨機(jī)數(shù),開發(fā)者使用了弱偽隨機(jī)數(shù)。

  第一種情況缓升,簡單來講鼓鲁,就是我們需要一個隨機(jī)數(shù),但是開發(fā)者沒有使用隨機(jī)數(shù)港谊,而是指定了一個常量骇吭。當(dāng)然,很多人會義憤填膺的說歧寺,sb才會不用隨機(jī)數(shù)燥狰。但是,請不要忽略我朝還是有很多的斜筐。主要有兩個場景:

  開發(fā)者缺乏基礎(chǔ)常識不知道要用隨機(jī)數(shù);

  一些應(yīng)用場景和框架龙致,接口文檔不完善或者開發(fā)者沒有仔細(xì)閱讀等原因。

  比如找回密碼的token顷链,需要一個偽隨機(jī)數(shù)目代,很多業(yè)務(wù)直接根據(jù)用戶名生成token;

比如OAuth2.0中需要第三方傳遞一個state參數(shù)作為CSRF Token防止CSRF攻擊,很多開發(fā)者根本不使用這個參數(shù)蕴潦,或者是傳入一個固定的值像啼。由于認(rèn)證方無法對這個值進(jìn)行業(yè)務(wù)層面有效性的校驗,導(dǎo)致了OAuth的CSRF攻擊潭苞。

  第二種情況,主要區(qū)別就在于偽隨機(jī)數(shù)的強(qiáng)弱了真朗,大部分(所有?)語言的API文檔中的基礎(chǔ)庫(常用庫)中的random庫都是弱偽隨機(jī)此疹,很多開發(fā)自然就直接使用。但是遮婶,最重要也最致命的是蝗碎,弱偽隨機(jī)數(shù)是不能用于密碼技術(shù)的。

  還是第一種情況中的找回密碼場景旗扑,關(guān)于token的生成蹦骑, 很多開發(fā)使用了時間戳作為隨機(jī)數(shù)(md5(時間戳),md5(時間戳+用戶名))臀防,但是由于時間戳是可以預(yù)測的眠菇,很容易就被猜解。不可預(yù)測性是區(qū)分弱偽隨機(jī)數(shù)和強(qiáng)偽隨機(jī)數(shù)的關(guān)鍵指標(biāo)袱衷。

  當(dāng)然捎废,除了以上兩種情況,還有一些比較特別的情況致燥,通常情況下比較少見登疗,但是也不排除:

  種子的泄露,算法很多時候是公開的,如果種子泄露了辐益,相當(dāng)于隨機(jī)數(shù)已經(jīng)泄露了;

  隨機(jī)數(shù)池不足。這個嚴(yán)格來說也屬于弱偽隨機(jī)數(shù)认罩,因為隨機(jī)數(shù)池不足其實也導(dǎo)致了隨機(jī)數(shù)是可預(yù)測的女仰,攻擊者可以直接暴力破解。

  漏洞實例

  wooyun上有很多漏洞乔外,還蠻有意思的杨幼,都是和隨機(jī)數(shù)有關(guān)的聂渊。

  PS:個人實力有限,以下實例基本都來自wooyun漏洞實例欲逃,在這里謝謝各位大牛饼暑,如有侵權(quán),請聯(lián)系刪除彰居。

  1.應(yīng)該使用隨機(jī)數(shù)而未使用隨機(jī)數(shù)

  Oauth2.0的這個問題特別經(jīng)典陈惰,除了wooyun實例列出來的毕籽,其實很多廠商都有這個問題。

  Oauth2.0中state參數(shù)要求第三方應(yīng)用的開發(fā)者傳入一個CSRF Token(隨機(jī)數(shù))画髓,如果沒有傳入或者傳入的不是隨機(jī)數(shù)平委,會導(dǎo)致CSRF登陸任意帳號:

  唯品會賬號相關(guān)漏洞可通過csrf登錄任意賬號

人人網(wǎng)-百度OAuth 2.0 redirect_uir CSRF 漏洞

  2.使用弱偽隨機(jī)數(shù)

  1) 密碼取回

很多密碼找回的場景,會發(fā)送給用戶郵件一個url肉微,中間包含一個token,這個token如果猜測勿负,那么就可以找回其他用戶的密碼奴愉。

1.Shopex?4.8.5密碼取回處新生成密碼可預(yù)測漏洞

  直接使用了時間函數(shù)microtime()作為隨機(jī)數(shù)铁孵,然后獲取MD5的前6位。

  1. substr(md5(print_r(microtime(),true)),0,6);

PHP 中microtime()的值除了當(dāng)前服務(wù)器的秒數(shù)外檀头,還有微秒數(shù)岖沛,微妙數(shù)的變化范圍在0.000000 -- 0.999999 之間婴削,一般來說,服務(wù)器的時間可以通過HTTP返回頭的DATE字段來獲取期升,因此我們只需要遍歷這1000000可能值即可互躬。但我們要使用暴力破解的方式發(fā)起1000000次請求的話吼渡,網(wǎng)絡(luò)請求數(shù)也會非常之大乓序。可是shopex非常貼心的在生成密碼前再次將microtime() 輸出了一次:

1. $messenger = &$this->system->loadModel('system/messenger');echo microtime()."

";

  2.奇虎360任意用戶密碼修改

直接是MD5(unix時間戳)

  3.涂鴉王國弱隨機(jī)數(shù)導(dǎo)致任意用戶劫持漏洞寄雀,附測試POC

  關(guān)于找回密碼隨機(jī)數(shù)的問題強(qiáng)烈建議大家參考拓哥的11年的文章《利用系統(tǒng)時間可預(yù)測破解java隨機(jī)數(shù)| 空虛浪子心的靈魂》

  2) 其他隨機(jī)數(shù)驗證場景

  CmsEasy最新版暴力注入(加解密缺陷/繞過防注入)

  弱偽隨機(jī)數(shù)被繞過

  Espcms v5.6 暴力注入

  Espcms中一處SQL注入漏洞的利用盒犹,利用時發(fā)現(xiàn)espcms對傳值有加密并且隨機(jī)key,但是這是一個隨機(jī)數(shù)池固定的弱偽隨機(jī)數(shù),可以被攻擊者遍歷繞過

DestoonB2B?2014-05-21最新版繞過全局防御暴力注入(官方Demo可重現(xiàn))

  使用了microtime()作為隨機(jī)數(shù)沮协,可以被預(yù)測暴力破解

Android?4.4之前版本的Java加密架構(gòu)(JCA)中使用的Apache Harmony 6.0M3及其之前版本的SecureRandom實現(xiàn)存在安全漏洞慷暂,具體位于classlib/modules/security/src/main/java/common/org/apache/harmony/security/provider/crypto/SHA1PRNG_SecureRandomImpl.java

  類的engineNextBytes函數(shù)里晨雳,當(dāng)用戶沒有提供用于產(chǎn)生隨機(jī)數(shù)的種子時,程序不能正確調(diào)整偏移量血久,導(dǎo)致PRNG生成隨機(jī)序列的過程可被預(yù)測。

  Android SecureRandom漏洞詳解

  安全建議

  上面講的隨機(jī)數(shù)基礎(chǔ)和漏洞實例更偏重是給攻擊者一些思路洋魂,這里更多的是一些防御和預(yù)防的建議喜鼓。

  業(yè)務(wù)場景需要使用隨機(jī)數(shù)庄岖,一定要使用隨機(jī)數(shù),比如Token的生成;

  隨機(jī)數(shù)要足夠長隅忿,避免暴力破解;

  保證不同用處的隨機(jī)數(shù)使用不同的種子

  對安全性要求高的隨機(jī)數(shù)(如密碼技術(shù)相關(guān))禁止使用的弱偽隨機(jī)數(shù):

  不要使用時間函數(shù)作為隨機(jī)數(shù)(很多程序員喜歡用時間戳) Java:system.currenttimemillis() php:microtime()

  不要使用弱偽隨機(jī)數(shù)生成器 Java: java.util.Random PHP: rand() 范圍很小,32767 PHP: mt_rand() 存在缺陷

強(qiáng)偽隨機(jī)數(shù)CSPRNG(安全可靠的偽隨機(jī)數(shù)生成器(CryptographicallySecure?Pseudo-Random Number Generator)的各種參考

  6.強(qiáng)偽隨機(jī)數(shù)生成(不建議開發(fā)自己實現(xiàn))

  產(chǎn)生高強(qiáng)度的隨機(jī)數(shù)优烧,有兩個重要的因素:種子和算法链峭。算法是可以有很多的,通常如何選擇種子是非常關(guān)鍵的因素熙卡。 如Random励饵,它的種子是System.currentTimeMillis(),所以它的隨機(jī)數(shù)都是可預(yù)測的颓鲜, 是弱偽隨機(jī)數(shù)。

  強(qiáng)偽隨機(jī)數(shù)的生成思路:收集計算機(jī)的各種灾杰,鍵盤輸入時間,內(nèi)存使用狀態(tài)麦备,硬盤空閑空間昭娩,IO延時,進(jìn)程數(shù)量呛梆,線程數(shù)量等信息磕诊,CPU時鐘滞磺,來得到一個近似隨機(jī)的種子莱褒,主要是達(dá)到不可預(yù)測性广凸。

暫時先寫到這里

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市脸哀,隨后出現(xiàn)的幾起案子企蹭,更是在濱河造成了極大的恐慌智末,老刑警劉巖徒河,帶你破解...
    沈念sama閱讀 219,110評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顽照,死亡現(xiàn)場離奇詭異,居然都是意外死亡尼酿,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評論 3 395
  • 文/潘曉璐 我一進(jìn)店門涎永,熙熙樓的掌柜王于貴愁眉苦臉地迎上來鹿响,“玉大人,你說我怎么就攤上這事妈倔《⒑” “怎么了?”我有些...
    開封第一講書人閱讀 165,474評論 0 356
  • 文/不壞的土叔 我叫張陵捧挺,是天一觀的道長松忍。 經(jīng)常有香客問我筷厘,道長,這世上最難降的妖魔是什么酥艳? 我笑而不...
    開封第一講書人閱讀 58,881評論 1 295
  • 正文 為了忘掉前任充石,我火速辦了婚禮,結(jié)果婚禮上骤铃,老公的妹妹穿的比我還像新娘。我一直安慰自己喊暖,他們只是感情好陵叽,可當(dāng)我...
    茶點故事閱讀 67,902評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著巩掺,像睡著了一般胖替。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上殉摔,一...
    開封第一講書人閱讀 51,698評論 1 305
  • 那天记焊,我揣著相機(jī)與錄音,去河邊找鬼碗硬。 笑死恩尾,一個胖子當(dāng)著我的面吹牛挽懦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播冀偶,決...
    沈念sama閱讀 40,418評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼进鸠,長吁一口氣:“原來是場噩夢啊……” “哼形病!你這毒婦竟也來了漠吻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,332評論 0 276
  • 序言:老撾萬榮一對情侶失蹤榔至,失蹤者是張志新(化名)和其女友劉穎欺劳,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,968評論 3 337
  • 正文 我和宋清朗相戀三年韩容,在試婚紗的時候發(fā)現(xiàn)自己被綠了群凶。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片请梢。...
    茶點故事閱讀 40,110評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡当窗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出元咙,到底是詐尸還是另有隱情蛾坯,我是刑警寧澤脉课,帶...
    沈念sama閱讀 35,792評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站呈驶,受9級特大地震影響袖瞻,放射性物質(zhì)發(fā)生泄漏聋迎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,455評論 3 331
  • 文/蒙蒙 一牺堰、第九天 我趴在偏房一處隱蔽的房頂上張望伟葫。 院中可真熱鬧扒俯,春花似錦撼玄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,003評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至灌闺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桂对,已是汗流浹背鸠匀。 一陣腳步聲響...
    開封第一講書人閱讀 33,130評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留宅此,地道東北人。 一個月前我還...
    沈念sama閱讀 48,348評論 3 373
  • 正文 我出身青樓父腕,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狱窘,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,047評論 2 355