精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

Java中的計時攻擊

科技綠洲 ? 來源:Java技術指北 ? 作者:Java技術指北 ? 2023-09-25 15:29 ? 次閱讀

計時攻擊

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

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

下面可以使用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行代碼的執行時間。

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

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

執行時間: 第一行 < 第二行 < 第三行

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

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

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

圖片

計時攻擊的防御

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

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

圖片

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

圖片

同時2021年jdk8的補丁也有相關的優化,

圖片

乍一看上面的代碼已經比較完美了。但是。。。。

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

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

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

//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;
}

小結

以上就是計時攻擊的一些簡單內容,網絡安全中的冰山一角。再次致敬這些維護JDK源碼的大師們!

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • JAVA
    +關注

    關注

    19

    文章

    2960

    瀏覽量

    104562
  • 字符
    +關注

    關注

    0

    文章

    232

    瀏覽量

    25178
  • 代碼
    +關注

    關注

    30

    文章

    4753

    瀏覽量

    68368
  • 加密算法
    +關注

    關注

    0

    文章

    211

    瀏覽量

    25531
收藏 人收藏

    評論

    相關推薦

    JavarestTemplate的使用

    JavarestTemplate的使用
    的頭像 發表于 01-13 15:41 ?1022次閱讀

    最新防攻擊教程

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

    CC攻擊

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

    網絡攻擊的相關資料分享

    持續檢測現有網絡的流量變化或者變化趨勢,從而得到相應信息的一種被動攻擊方式。主動攻擊:是指通過一系列的方法,主動地獲取向被攻擊對象實施破壞的一種
    發表于 12-23 07:00

    cc攻擊防御解決方法

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

    對Rijndael的JAVA差分攻擊與防范

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

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

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

    java學習——java的反射學習筆記

    本文檔內容介紹了java學習java的反射學習筆記,供參考
    發表于 03-13 14:19 ?0次下載

    如何預防區塊鏈的日蝕攻擊和DDos攻擊

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

    java怎么使用HTTP代理

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

    JavaGet和Post的使用

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

    如何區分Javaprint和println

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

    Java創建對象有哪些方式

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

    Java的線程狀態轉換

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

    Java時間戳的使用

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