最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

密碼密鑰硬編碼檢查

2022-10-13 14:09 作者:名字呀恁難取  | 我要投稿

1. 密鑰的重要性

1.1. 看風(fēng)

我們還是先說(shuō)故事。話說(shuō)2006年有一個(gè)柳云龍的電視連續(xù)劇《暗算》分為三部曲《聽(tīng)風(fēng)》、《看風(fēng)》、《捕風(fēng)》。很有意思的是三個(gè)故事里都有個(gè)“風(fēng)”字。你看過(guò)風(fēng)嗎?我沒(méi)看到,只看見(jiàn)樹(shù)葉飄動(dòng),才知道風(fēng)來(lái)過(guò)。風(fēng),來(lái)無(wú)影,去無(wú)蹤,無(wú)孔不入,又無(wú)處不在。三部曲分別對(duì)應(yīng):偵聽(tīng)、破譯和諜報(bào)。故事描述了老一輩情報(bào)人員(一群與風(fēng)打交道的人),與敵斗智斗勇的故事,信仰的力量讓他們無(wú)所畏懼、勇往直前,看得人蕩氣回腸,催人淚下。

由于平時(shí)很少看電視,去年正在為一個(gè)算法發(fā)愁,偶然看到這個(gè)劇,感同身受,便一口氣看完了,里面一些對(duì)加密算法邏輯的一些看法,還是給了當(dāng)時(shí)的我很大的啟發(fā),讓我完成了當(dāng)時(shí)的算法,還特意發(fā)了微博紀(jì)念。 個(gè)人比較喜歡《看風(fēng)》破譯密碼這個(gè)章節(jié),里面有句經(jīng)典的臺(tái)詞:風(fēng)是看不見(jiàn)的,破譯密碼就是看見(jiàn)了風(fēng),密碼是兵器,是兵器中的暗器。

1.2. 保密通信模型

·?保密通信模型

·?


密碼學(xué)有一個(gè)重要的產(chǎn)物——密鑰。密鑰作為信息在傳播時(shí)用來(lái)加密的工具起著非常重要的作用。主流的六種密碼技術(shù),就是圍繞密鑰展開(kāi)的:對(duì)稱(chēng)密碼、非對(duì)稱(chēng)密碼、單向散列函數(shù)、消息認(rèn)證碼、數(shù)字簽名、偽隨機(jī)數(shù)生成器。

1.3. 密鑰的重要性

·?古典密碼學(xué)(1949年之前)

·?數(shù)據(jù)的安全主要是基于算法的保密。

送你一首小詩(shī):

我畫(huà)藍(lán)江水悠悠,

愛(ài)晚亭上楓葉愁。

秋月溶溶照佛寺,

香煙裊裊繞經(jīng)樓。

如果不告訴你這是首藏頭詩(shī),你還真的很難猜到唐伯虎對(duì)秋香的表白:“我愛(ài)秋香”。 藏頭詩(shī)就是加密算法的一種。

由于西方文字是由字母組成,字母又是有序的字符集。所以在對(duì)文字加密時(shí),密碼算法很容易想到采用:替代密碼、置換密碼或替代與置換密碼的組合,來(lái)完成完成信息的加密。公元前1世紀(jì)古羅馬的凱撒密碼,就是對(duì)文字中的字母,采用它在字母表中之后的第k個(gè)字母來(lái)代換,從而變成密文。在解密時(shí),反向移動(dòng)k個(gè)字母進(jìn)行還原。

這個(gè)時(shí)代將密碼發(fā)展到巔峰的,要算二戰(zhàn)時(shí)期德軍用機(jī)械實(shí)現(xiàn)的轉(zhuǎn)輪機(jī)(RotorMachine)ENIGMA密碼,很多的諜戰(zhàn)片都是圍繞這個(gè)機(jī)器展開(kāi)的。

這個(gè)時(shí)期的密碼存在很多的問(wèn)題:

·?不適合大規(guī)模生產(chǎn)

·?不適合較大的或者人員變動(dòng)較大的組織

·?用戶無(wú)法了解算法的安全性

奧古斯特·柯克霍夫在19世紀(jì)提出了密碼學(xué)上的柯克霍夫原則(Kerckhoffs’s principle)由:即使密碼系統(tǒng)的任何細(xì)節(jié)已為人悉知,只要密鑰(key)未泄漏,它也應(yīng)是安全的。?這個(gè)原則指導(dǎo)了以后的密碼學(xué)算法的發(fā)展。

·?近代密碼學(xué)(1949-1975)

·?數(shù)據(jù)的安全基于密鑰,而不是算法的保密。

香農(nóng)在20世紀(jì)40年代末發(fā)表的一系列論文,特別是1949年的《保密系統(tǒng)通信理論》,把密碼學(xué)推向了基于信息論的科學(xué)軌道。

這階段的發(fā)展主要是對(duì)稱(chēng)加密算法。對(duì)稱(chēng)加密是發(fā)送方使用某種公開(kāi)的算法使用密鑰對(duì)明文進(jìn)行加密,接收方使用之前發(fā)送方給予的密鑰對(duì)密文進(jìn)行解密得到明文。近代密碼發(fā)展中一個(gè)重要突破是“數(shù)據(jù)加密標(biāo)準(zhǔn)”(DES)的出現(xiàn)。

·?現(xiàn)代密碼學(xué)(1976-)

公鑰密碼使得發(fā)送端和接收端無(wú)密鑰傳輸?shù)谋C芡ㄐ懦蔀榭赡堋?/p>

1976 年 Diffie 和 Hellman 的公鑰密碼的思想提出,標(biāo)志著現(xiàn)代密碼學(xué)的誕生。這是密碼學(xué)發(fā)展史上具有里程碑意義的大事件,自此提出了許多種公鑰密碼體制 ,如基于分解大整數(shù)的困難性的密碼體制——RSA 密碼體制及其變種、基于離散對(duì)數(shù)問(wèn)題的公鑰密碼體制。

1.4. 密鑰泄露的危害

影響密碼系統(tǒng)安全性的基本因素:密碼算法復(fù)雜度、密鑰機(jī)密性、密鑰長(zhǎng)度。其中密鑰機(jī)密性與主要與密鑰的管理相關(guān)。如何保護(hù)好密鑰的安全就成了信息安全的非常重要的一個(gè)部分。

在現(xiàn)在的應(yīng)用系統(tǒng)中,密碼、密鑰往往被作為一種訪問(wèn)密鑰(access key)或憑證(Credentials),用于系統(tǒng)之間建立鏈接,避免了用戶密碼的明文傳輸。很多時(shí)候訪問(wèn)密鑰等同于密碼。

例如我們熟悉的GitHub的訪問(wèn)密鑰。當(dāng)我們獲得Github某個(gè)庫(kù)的地址訪問(wèn)密鑰,就可以在Windows的憑證管理或本地Git的憑證管理里添加這個(gè)訪問(wèn)密鑰,本地git和遠(yuǎn)端的訪問(wèn)庫(kù)地址就建立了信任鏈接,不再需要每次都輸入密碼。

但密鑰本地化,也會(huì)導(dǎo)致密鑰分散在代碼、配置文件中。一旦缺乏對(duì)密鑰的統(tǒng)一管理, 就容易導(dǎo)致密鑰泄露。員工不慎將密鑰泄漏到開(kāi)源網(wǎng)站導(dǎo)致重要數(shù)據(jù)丟失事件時(shí)有發(fā)生。

2018年某酒店集團(tuán)共140G約5億條個(gè)人信息遭泄露,被發(fā)現(xiàn)泄露的信息在境外黑市中售賣(mài)。究其原因,是該集團(tuán)對(duì)員工的安全意識(shí)缺乏足夠的教育培訓(xùn),導(dǎo)致開(kāi)發(fā)人員在無(wú)意識(shí)的情況下將公司測(cè)試平臺(tái)的賬號(hào)密碼發(fā)到 GitHub上,使得黑客下載了整個(gè)數(shù)據(jù)。

我們從Verizon(美國(guó)最大的有線通信和語(yǔ)音通信提供商),每年發(fā)布的《數(shù)據(jù)泄露調(diào)查報(bào)告(Data Breach Investigations Report(DBIR))》,來(lái)看下密碼密鑰在信息泄露中被黑客利用的情況。

·?


《2020數(shù)據(jù)泄露調(diào)查報(bào)告(DBIR)》

使用偷竊的信用憑證、利用員工誤發(fā)送、員工誤配置是數(shù)據(jù)泄露的主要威脅。內(nèi)部員工操作不規(guī)范、沒(méi)有養(yǎng)成良好的工作行為習(xí)慣以及疏忽大意等, 已成為多起嚴(yán)重網(wǎng)絡(luò)安全事件發(fā)生的根本原因。

?


?

《2021數(shù)據(jù)泄露調(diào)查報(bào)告(DBIR)》

61%的數(shù)據(jù)泄露涉及憑證數(shù)據(jù),憑證的泄露是信息泄露的主要途徑,防止憑證泄露對(duì)信息保護(hù)有著重要的作用。

?


《2022數(shù)據(jù)泄露調(diào)查報(bào)告(DBIR)》

憑證是發(fā)起攻擊的最重要的手段。

?


?

憑證和個(gè)人數(shù)據(jù)是黑客最喜歡獲取的兩類(lèi)數(shù)據(jù)

報(bào)告指出:我們長(zhǎng)期以來(lái)一直認(rèn)為,憑證是犯罪分子最喜歡的數(shù)據(jù)類(lèi)型,因?yàn)樗鼈儗?duì)于偽裝成系統(tǒng)上的合法用戶非常有用。就像諺語(yǔ)中披著羊皮的狼一樣,它們的行為在攻擊之前顯得無(wú)害。

?

o?

2. 密碼密鑰硬編碼的檢查

接下來(lái)我們看下如何防范密碼密鑰在帶碼中由于硬編碼導(dǎo)致的泄露。

先來(lái)看些如何鑒別密碼密鑰。

2.1. 香農(nóng)熵(Shannon entropy)

密鑰的長(zhǎng)度決定了密鑰空間(keyspace),通常以位為單位。密鑰空間越大,密鑰被攻破的難度就越大。

密鑰是由密鑰空間的隨機(jī)值構(gòu)成。對(duì)于任意一個(gè)隨機(jī)變量 X,它的熵定義如下:

H(X) = -?\sum_{x=1}^nP(x_i)log_2[P(x_i)]∑x=1nP(xi)log2[P(xi)]

變量的不確定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。

·?P(x_i)P(xi)?: 指的是單個(gè)樣本變量所屬的變量種類(lèi)的個(gè)數(shù)占據(jù)所有變量個(gè)數(shù)的比例。

舉例:數(shù)據(jù)data有六個(gè)值,分為別為:[a,b,c,a,b,a];

樣本總個(gè)數(shù)是6,變量種類(lèi)數(shù)3;分別為[a:3, b:2, c:1]

所以對(duì)應(yīng)的pi分別為[a:1/2, b:1/3, c:1/6]

公式計(jì)算log以2為底數(shù)的pi的對(duì)數(shù)值,然后再乘以pi的負(fù)數(shù),再計(jì)算其加和,得到的便是香農(nóng)熵的值:1.4591479170272448。

/**

?* Base on shannon entropy return bits of entropy represented in string.

?*

?* @param str input string

?* @return entropy

?*/public?static?double?getShannonEntropy(String?str)?{

????int?num =?0;

????Map<Character, Integer>?pi =?new?HashMap<Character, Integer>();

?

????// count char in string

????char?cx;

????for?(int?l =?0;?l <?str.length();?++l)?{

????????cx =?str.charAt(l);

????????if?(pi.containsKey(cx))?{

????????????pi.put(cx,?pi.get(cx)?+?1);

????????}?else?{

????????????pi.put(cx,?1);

????????}

????????num =?num +?1;

????}

?

????double?entropy =?0.0;

????for?(Map.Entry<Character, Integer>?entry :?pi.entrySet())?{

????????cx =?entry.getKey();

????????double?p =?(double)?entry.getValue()?/?num;

????????entropy =?entropy +?p *?(Math.log(p)?/?Math.log(2));

????}

?

????return?-entropy;}

·?同等長(zhǎng)度的字符串,通常密鑰的熵值更高

·?密鑰為避免彩虹攻擊,在取值上更加的離散,會(huì)盡量采用不重復(fù)的字符。就像我們?yōu)榱嗽黾用艽a的復(fù)雜性,要求長(zhǎng)度不小于8,必須包含大小寫(xiě)、特殊字符、以及數(shù)字一樣的道理,所以密鑰的熵值會(huì)比一般的文本要高的多。我們就是利用這點(diǎn)來(lái)識(shí)別字符串是否是密鑰。

2.2. 工具的檢查邏輯

對(duì)于密碼密鑰的硬編碼檢查可以采用靜態(tài)分析工具來(lái)完成。工具的檢查過(guò)程通常包含四個(gè)過(guò)程:輸入文件準(zhǔn)備、檢查、過(guò)濾和報(bào)告輸出。

?


2.2.1. 輸入文件轉(zhuǎn)換

·?輸入文件分類(lèi)

·?我們需要檢查的文本文件進(jìn)行分類(lèi),通常包括以下幾種類(lèi)型:

o?程序語(yǔ)言:C、C++、Java、Python、Go、Js等;

o?有統(tǒng)一格式的文件:屬性文件、yaml、csv、json、xml等;

o?文本文件:沒(méi)有固定格式的文本文件。

分類(lèi)的目的是為了更好的識(shí)別文件中的字符串常量,充分利用字符串常量的上下文關(guān)聯(lián),以便在分析中最大程度的減少誤報(bào)。

·?輸入文件轉(zhuǎn)換

o?程序語(yǔ)言:通過(guò)各語(yǔ)言的語(yǔ)法解析器,解析成抽象語(yǔ)法樹(shù),提取語(yǔ)法樹(shù)中的等于字符串的常量,以及對(duì)應(yīng)的變量名;

o?有統(tǒng)一格式的文件:照格式轉(zhuǎn)換成變量名和字符串常量值;

o?文本文件:采用token的方式分割成一個(gè)個(gè)的token,變成一個(gè)各的字符串常量。

2.2.2. 密碼密鑰檢查

在我們得到大量的變量名和字符串常量后,主要通過(guò)正則表達(dá)式匹配的方式完成目標(biāo)的篩選。

由于檢查密碼密鑰的種類(lèi)和類(lèi)型不同,可以通過(guò)配置文件來(lái)提高檢查能力的可擴(kuò)展性。

·?檢查配置選項(xiàng)主要包括以下內(nèi)容:

信息

描述

選項(xiàng)

檢查類(lèi)型

可分為:變量名、字符串常量、或兩個(gè)都檢查

必選

密碼密鑰的類(lèi)型

用于區(qū)分不同類(lèi)型的密碼密鑰;同時(shí)用于告警時(shí)區(qū)分具體檢測(cè)到的密碼密鑰類(lèi)型

必選

正則表達(dá)式

主要設(shè)定匹配的長(zhǎng)度,每個(gè)字符的可選類(lèi)型

必選

熵值的閾值

用于精確的識(shí)別密碼密鑰的類(lèi)型,降低誤報(bào)

可選

例如:

·?檢查硬編碼的口令:檢查變量名中包含:password、passwd、pwd的變量,且變量等于字符串常量;正則表達(dá)式可以設(shè)置成為:".*(password|passwd|pwd)$"。

·?檢查GitHub的個(gè)人憑證:檢查字符串常量;這個(gè)憑證是以"ghp_"開(kāi)頭的,跟隨長(zhǎng)度為36的字符串,且每個(gè)字符可以為數(shù)字和字母;正則表達(dá)式可以設(shè)置成為:“ghp_[0-9a-zA-Z]{36}”。

2.2.3. 密碼密鑰過(guò)濾

靜態(tài)分析能很大程度上減少了人工審核的工作量,但由于檢查模式的不確定性,也會(huì)帶來(lái)不少的誤報(bào)。誤報(bào)會(huì)給用戶在審核過(guò)程中帶來(lái)很多的負(fù)面情緒,從而不愿繼續(xù)使用工具。為了進(jìn)一步降低誤報(bào),我們可以通過(guò)下面的方式來(lái)降低誤報(bào):

·?

密碼密鑰熵值的計(jì)算

前面討論過(guò)密碼密鑰的特點(diǎn),可以通過(guò)檢測(cè)密碼密鑰的信息熵的方式來(lái)降低誤報(bào)。有些密碼密鑰設(shè)定了最低的閾值,但還是有很多密碼密鑰并未給出具體的閾值,這個(gè)就需要通過(guò)經(jīng)驗(yàn)積累來(lái)設(shè)定,目前業(yè)界也有通過(guò)機(jī)器學(xué)習(xí)來(lái)完善這個(gè)閾值的設(shè)定。

·?

·?

污點(diǎn)分析

在代碼中,對(duì)于口令的變量的取名上,很多并不會(huì)遵守可讀性和可維護(hù)性來(lái)設(shè)定變量名,通過(guò)前面正則表達(dá)式的方式來(lái)查找硬編碼密碼的方式,會(huì)造成很多的漏報(bào)。這里還可以通過(guò)污點(diǎn)分析的方法,來(lái)推導(dǎo)出密碼是否采用了硬編碼。例如檢查jdbc連接的密碼參數(shù),查看該參數(shù)是否為字符串常量。

·?

2.2.4. 報(bào)告輸出

將經(jīng)過(guò)過(guò)濾后的結(jié)果,輸出告警,給出可能泄露的文件名和變量或可能為密碼密鑰的常量字符串位置,便于人工的排查。

·?

?


密碼密鑰硬編碼檢查的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國(guó)家法律
岐山县| 宜川县| 凤山市| 衡东县| 宝坻区| 宁波市| 沭阳县| 昔阳县| 满洲里市| 德州市| 陈巴尔虎旗| 双桥区| 卫辉市| 垦利县| 庆安县| 台南市| 冕宁县| 桓台县| 盐城市| 花垣县| 东海县| 大埔区| 光山县| 左云县| 普洱| 松滋市| 格尔木市| 宜春市| 濮阳市| 迁安市| 东乡族自治县| 琼中| 汤阴县| 武威市| 镇江市| 蓬溪县| 平谷区| 石渠县| 芷江| 新昌县| 江陵县|