成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

相等有時候也不安全!你知道嗎?

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

哈嘍,大家好,我是指北君。

最近世界杯看了幾場球賽,克羅地亞淘汰巴西, 摩洛哥淘汰葡萄牙。兩場都非常精彩,克羅地亞的堅韌令人佩服,絕境逆襲。總之這一屆世界杯絕對會影響以后足球的戰術打法。

言歸正傳哈,最近依然在搬磚哈,看到了關于計時攻擊的內容,而這個又和我們常用的equals方法關系密切。然后就迫不及待的去扒一扒了。

? 計時攻擊

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源碼的大師們!

不斷防范,不斷升級才有了我們越來越安全的代碼。

jdk changeset:

  • http://hg.openjdk.java.net/jdk6/jdk6/jdk/rev/562da0baf70b
  • http://hg.openjdk.java.net/jdk8u/jdk8u/jdk/rev/54441ec952f7
  • http://crypto.stanford.edu/~dabo/papers/ssl-timing.pdf
責任編輯:武曉燕 來源: Java技術指北
相關推薦

2021-12-08 07:31:40

Linux安全病毒

2019-06-14 15:36:13

Windows 10安全PC

2022-05-09 07:49:47

PulsarJava問題排查

2023-07-11 00:12:05

2024-06-14 08:36:57

2019-03-30 14:39:11

2018-11-27 15:09:36

HTTPS網絡安全攻擊

2025-02-17 07:29:05

2015-07-01 14:48:51

2011-12-28 11:05:12

2023-07-26 00:16:49

2023-12-20 08:23:53

NIO組件非阻塞

2024-04-30 09:02:48

2023-12-12 08:41:01

2023-04-26 10:21:04

2020-11-04 17:35:39

網絡安全漏洞技術

2018-07-08 23:46:57

2014-01-22 09:17:12

2024-05-28 09:12:10

2024-04-07 00:00:00

ESlint命令變量
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久久噜噜噜精品国产亚洲综合 | 99久久精品免费看国产四区 | 免费视频一区 | 97伊人 | 午夜影院在线观看免费 | 欧美乱大交xxxxx另类电影 | 久久成人综合 | 亚洲欧美一区二区三区国产精品 | 国产成人精品视频在线观看 | 日日日视频 | 福利视频三区 | 久久久国产一区二区三区四区小说 | 久久黄网| 羞羞视频网站 | 日韩欧美视频 | 欧州一区二区三区 | 日韩三级电影在线看 | 久久久精品网站 | 亚洲狠狠爱 | 国产精品激情在线 | 久久久久亚洲精品国产 | 狠狠干狠狠操 | 免费黄色的视频 | 99久久精品国产毛片 | 日韩精品在线看 | 久久亚洲一区二区三 | 亚洲在线一区二区 | 99re国产 | 国产精品视频一区二区三区四蜜臂 | 精品国产乱码久久久久久影片 | 视频在线观看一区 | 我想看国产一级毛片 | av看看| 波多野结衣精品在线 | 日韩电影一区 | 国产亚洲精品精品国产亚洲综合 | 精品一区二区久久久久久久网精 | 国产高清精品在线 | 一区二区三区中文字幕 | 国产精品一区二区视频 | 国产一区免费视频 |