chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Java中的計時攻擊

科技綠洲 ? 來源:Java技術(shù)指北 ? 作者:Java技術(shù)指北 ? 2023-09-25 15:29 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

計時攻擊

Timing Attack ,時序攻擊,是一種側(cè)信道攻擊,攻擊者嘗試分析加密算法的時間執(zhí)行順序來推導(dǎo)出密碼。每個邏輯運算都需要執(zhí)行時間,但是 根據(jù)不同的輸入值,精確測量執(zhí)行時間,根據(jù)執(zhí)行時間反推出密碼的一些區(qū)域

簡單理解,就是破解密碼的人,通過不同的輸入策略組合嘗試去驗證密碼,得到不同的執(zhí)行時間,從而反推出密碼的區(qū)域,降低破解密碼的難度。

下面可以使用Java簡單描述一下。

我們看一下Java中的String equals方法(Java17)

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    return (anObject instanceof String aString)
            && (!COMPACT_STRINGS || this.coder == aString.coder)
            && StringLatin1.equals(value, aString.value);
}

//StringLatin1.equals
@IntrinsicCandidate
public static boolean equals(byte[] value, byte[] other) {
    if (value.length == other.length) {
        for (int i = 0; i < value.length; i++) {
            if (value[i] != other[i]) {
                return false;
            }
        }
        return true;
    }
    return false;
}

以上方法中字符串比較一旦遇到不同的字符,那么就直接返回失敗。

那么看一下下面的3行代碼的執(zhí)行時間。

"adfg".equals("abcd");
"abfg".equals("abcd");
"abcg".equals("abcd");

以上的3行字符串比較方法執(zhí)行時間是不同的。

執(zhí)行時間: 第一行 < 第二行 < 第三行

假如現(xiàn)在我們要猜出另外一個字符串,那么如果我們用暴力窮舉猜測字符串,則 根據(jù)不同的字符串組合,得到的執(zhí)行時間是不一樣的,那么根據(jù)不同的執(zhí)行時間分析,就可以知道前面幾個字符串是否正確,從而縮小范圍 。

以上是一個計時攻擊的簡單例子,實際密碼加密,公私鑰加密算法是比較復(fù)雜的,但是也要考慮計時攻擊的影響。

多年前斯坦福的教授們專門針對這些問題發(fā)表過相關(guān)的論文,下面這篇于2005年發(fā)表在《Computer networks》的期刊論證了遠程網(wǎng)絡(luò)計時攻擊的可能性。

圖片

計時攻擊的防御

那么對于計時攻擊這種要如何防止呢, 大部分的做法是使單向加密,或者密碼驗證的算法執(zhí)行時間不會隨著輸入值的不同而規(guī)律變化 。換句話說就是 不同的輸入值的執(zhí)行時間相同 ,或者 執(zhí)行時間隨機分布 , 無法規(guī)律判斷 。

2009年jdk6的一個升級中就有相關(guān)的優(yōu)化來防止計時攻擊。MessageDigest是java.security包里面的類,主要用于SHA或 MD5 等密碼上安全的報文摘要功能而設(shè)計。最終會用到其equals方法。而這個改動就是針對equals方法。

圖片

其中關(guān)鍵的改動就是判斷字符串相等時,不再看到不相等的字符就返回false。而是 對比完所有的字符之后再返回結(jié)果 。這樣代碼的執(zhí)行時間就大致相同。

圖片

同時2021年jdk8的補丁也有相關(guān)的優(yōu)化,

圖片

乍一看上面的代碼已經(jīng)比較完美了。但是。。。。

密碼字符串的信息 還有長度信息

還是有坑哈。。。。。
其實上述中的代碼還有一個問題,就是 不同長度的字符串的執(zhí)行時間也不一樣 ,那么如果我搞一輪不同長度字符串窮舉之后,可以 根據(jù)運行計算時間的不同可以推出密碼的長度 。再進行破解相對容易一點。

再看如今Java17中的這個方法, 長度不同時也不會立馬返回false ,而是照常執(zhí)行整個代碼,這樣就避免了根據(jù)執(zhí)行時間先得到密碼的長度。

//MessageDigest
public static boolean isEqual(byte[] digesta, byte[] digestb) {
    if (digesta == digestb) return true;
    if (digesta == null || digestb == null) {
        return false;
    }

    int lenA = digesta.length;
    int lenB = digestb.length;

    if (lenB == 0) {
        return lenA == 0;
    }

    int result = 0;
    result |= lenA - lenB;

    // time-constant comparison
    for (int i = 0; i < lenA; i++) {
        // If i >= lenB, indexB is 0; otherwise, i.
        int indexB = ((i - lenB) > >> 31) * i;
        result |= digesta[i] ^ digestb[indexB];
    }
    return result == 0;
}

小結(jié)

以上就是計時攻擊的一些簡單內(nèi)容,網(wǎng)絡(luò)安全中的冰山一角。再次致敬這些維護JDK源碼的大師們!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2992

    瀏覽量

    114841
  • 字符
    +關(guān)注

    關(guān)注

    0

    文章

    237

    瀏覽量

    25915
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4922

    瀏覽量

    72248
  • 加密算法
    +關(guān)注

    關(guān)注

    0

    文章

    219

    瀏覽量

    26059
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    JavarestTemplate的使用

    JavarestTemplate的使用
    的頭像 發(fā)表于 01-13 15:41 ?1493次閱讀

    最新防攻擊教程

    最新防攻擊教程 別人攻擊的使用方法 傳奇防御攻擊 傳奇攻擊方法超級CC 超級穿墻CC 穿金盾CC 穿墻CC攻擊器 防穿墻DDOS 傳奇網(wǎng)關(guān)
    發(fā)表于 09-06 20:42

    CC攻擊

    CC攻擊是DDOS(分布式拒絕服務(wù))的一種,相比其它的DDOS攻擊CC似乎更有技術(shù)含量一些。這種攻擊你見不到虛假IP,見不到特別大的異常流量,但造成服務(wù)器無法進行正常連接,聽說一條ADSL足以搞掂
    發(fā)表于 09-10 15:59

    網(wǎng)絡(luò)攻擊的相關(guān)資料分享

    持續(xù)檢測現(xiàn)有網(wǎng)絡(luò)的流量變化或者變化趨勢,從而得到相應(yīng)信息的一種被動攻擊方式。主動攻擊:是指通過一系列的方法,主動地獲取向被攻擊對象實施破壞的一種
    發(fā)表于 12-23 07:00

    cc攻擊防御解決方法

    靜態(tài)頁面由于動態(tài)頁面打開速度慢,需要頻繁從數(shù)據(jù)庫調(diào)用大量數(shù)據(jù),對于cc攻擊者來說,甚至只需要幾臺肉雞就可以把網(wǎng)站資源全部消耗,因此動態(tài)頁面很容易受到cc攻擊。正常情況靜態(tài)頁面只有幾十kb,而動態(tài)
    發(fā)表于 01-22 09:48

    對Rijndael的JAVA差分攻擊與防范

    本文探討了對Rijndael算法的各種攻擊,介紹了一種對Rijndael算法差分攻擊JAVA實現(xiàn),提出了幾種防范對Rijndael算法差分攻擊的方法。關(guān)鍵詞:Rijndael;
    發(fā)表于 08-22 10:06 ?14次下載

    java數(shù)組的三種定義方式_java數(shù)組的定義及使用方法(推薦)

    java,數(shù)組是一種很常用的工具,本文將介紹來java數(shù)組的三種定義方式以及java數(shù)組的
    發(fā)表于 01-29 09:53 ?3.3w次閱讀

    java學(xué)習(xí)——java的反射學(xué)習(xí)筆記

    本文檔內(nèi)容介紹了java學(xué)習(xí)java的反射學(xué)習(xí)筆記,供參考
    發(fā)表于 03-13 14:19 ?0次下載

    如何預(yù)防區(qū)塊鏈的日蝕攻擊和DDos攻擊

    日蝕攻擊( Eclipse Attack )是面向?qū)Φ龋?P2P )網(wǎng)絡(luò)的一種攻擊類型,攻擊者通過攻擊手段使得受害者不能從網(wǎng)絡(luò)的其它部分接
    發(fā)表于 08-26 10:43 ?2689次閱讀
    如何預(yù)防區(qū)塊鏈<b class='flag-5'>中</b>的日蝕<b class='flag-5'>攻擊</b>和DDos<b class='flag-5'>攻擊</b>

    java怎么使用HTTP代理

    java怎么使用HTTP代理,華益云python爬蟲ip
    的頭像 發(fā)表于 09-01 14:31 ?2048次閱讀

    JavaGet和Post的使用

    JavaGet和Post的使用
    的頭像 發(fā)表于 01-12 15:38 ?1227次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>Get和Post的使用

    如何區(qū)分Javaprint和println

    在最開始學(xué)習(xí)Java的時候?qū)W到sout+enter鍵可以輸出結(jié)果,顯示的是System.out.println();而在Python是直接使用print。那么在Javaprint和
    的頭像 發(fā)表于 02-21 15:10 ?1654次閱讀

    Java創(chuàng)建對象有哪些方式

    1 問題 作為Java開發(fā)者,經(jīng)常創(chuàng)建很多對象,你是否知道Java創(chuàng)建對象有哪些方式呢?
    的頭像 發(fā)表于 02-24 10:29 ?1376次閱讀

    Java的線程狀態(tài)轉(zhuǎn)換

    Java 中線程的生命周期中一共有 6 種狀態(tài)。New(新創(chuàng)建);Runnable(可運行);Blocked(被阻塞);Waiting(等待);Timed Waiting(計時等待);Terminated(被終止)。
    的頭像 發(fā)表于 06-02 10:07 ?1023次閱讀
    在<b class='flag-5'>Java</b><b class='flag-5'>中</b>的線程狀態(tài)轉(zhuǎn)換

    Java時間戳的使用

    Java時間戳的使用
    的頭像 發(fā)表于 11-06 16:04 ?664次閱讀
    <b class='flag-5'>Java</b><b class='flag-5'>中</b>時間戳的使用