日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

这 10 行比较字符串相等的代码给我整懵了,不信你也来看看

發布時間:2024/8/23 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 这 10 行比较字符串相等的代码给我整懵了,不信你也来看看 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源 | 程序猿石頭

責編 | Carol

?封圖 | CSDN 下載自視覺中國

先直接上代碼:

boolean?safeEqual(String?a,?String?b)?{if?(a.length()?!=?b.length())?{return?false;}int?equal?=?0;for?(int?i?=?0;?i?<?a.length();?i++)?{equal?|=?a.charAt(i)?^?b.charAt(i);}return?equal?==?0; }

上面的代碼是我根據原版(Scala)翻譯成?Java的,Scala?版本(最開始吸引程序猿石頭注意力的代碼)如下:

def?safeEqual(a:?String,?b:?String)?=?{if?(a.length?!=?b.length)?{false}?else?{var?equal?=?0for?(i?<-?Array.range(0,?a.length))?{equal?|=?a(i)?^?b(i)}equal?==?0} }

剛開始看到這段源碼感覺挺奇怪的,這個函數的功能是比較兩個字符串是否相等,首先“長度不等結果肯定不等,立即返回”這個很好理解。

再看看后面的,稍微動下腦筋,轉彎下也能明白這其中的門道:通過異或操作1^1=0, 1^0=1, 0^0=0,來比較每一位,如果每一位都相等的話,兩個字符串肯定相等,最后存儲累計異或值的變量equal必定為 0,否則為 1。

再細想一下呢?

for?(i?<-?Array.range(0,?a.length))?{if?(a(i)?^?b(i)?!=?0)?//?or?a(i)?!=?b[i]return?false }

我們常常講性能優化,從效率角度上講,難道不是應該只要中途發現某一位的結果不同了(即為1)就可以立即返回兩個字符串不相等了嗎?(如上所示)。

這其中肯定有什么不可告人的秘密……

再再細想一下呢?

結合方法名稱?safeEquals?可能知道些眉目,與安全有關。

本文開篇的代碼來自playframewok 里用來驗證cookie(session)中的數據是否合法(包含簽名的驗證),也是石頭寫這篇文章的由來。

以前知道通過延遲計算等手段來提高效率的手段,但這種已經算出結果卻延遲返回的,還是頭一回!

我們來看看,JDK 中也有類似的方法,如下代碼摘自?java.security.MessageDigest:

public?static?boolean?isEqual(byte[]?digesta,?byte[]?digestb)?{if?(digesta?==?digestb)?return?true;if?(digesta?==?null?||?digestb?==?null)?{return?false;}if?(digesta.length?!=?digestb.length)?{return?false;}int?result?=?0;//?time-constant?comparisonfor?(int?i?=?0;?i?<?digesta.length;?i++)?{result?|=?digesta[i]?^?digestb[i];}return?result?==?0; }

看注釋知道了,目的是為了用常量時間復雜度進行比較。

但這個計算過程耗費的時間不是常量有啥風險?(小朋友,你是否有很多問號?)

真相大白

再深入探索和了解了一下,原來這么做是為了防止計時攻擊(Timing Attack)。(也有人翻譯成時序攻擊)

那么,真相只有一個!

計時攻擊(Timing Attack)


計時攻擊是邊信道攻擊(或稱"側信道攻擊", Side Channel Attack, 簡稱SCA) 的一種,邊信道攻擊是一種針對軟件或硬件設計缺陷,走“歪門邪道”的一種攻擊方式。

這種攻擊方式是通過功耗、時序、電磁泄漏等方式達到破解目的。在很多物理隔絕的環境中,往往也能出奇制勝,這類新型攻擊的有效性遠高于傳統的密碼分析的數學方法(某百科上說的)。

這種手段可以讓調用?safeEquals("abcdefghijklmn", "xbcdefghijklmn")?(只有首位不相同)和調用?safeEquals("abcdefghijklmn", "abcdefghijklmn")?(兩個完全相同的字符串)的所耗費的時間一樣。防止通過大量的改變輸入并通過統計運行時間來暴力破解出要比較的字符串。

舉個????,如果用之前說的“高效”的方式來實現的話。假設某個用戶設置了密碼為?password,通過從a到z(實際范圍可能更廣)不斷枚舉第一位,最終統計發現?p0000000?的運行時間比其他從任意a~z的都長(因為要到第二位才能發現不同,其他非?p?開頭的字符串第一位不同就直接返回了),這樣就能猜測出用戶密碼的第一位很可能是p了,然后再不斷一位一位迭代下去最終破解出用戶的密碼。

當然,以上是從理論角度分析,確實容易理解。但實際上好像通過統計運行時間總感覺不太靠譜,這個運行時間對環境太敏感了,比如網絡,內存,CPU負載等等都會影響。

但安全問題感覺更像是 “寧可信其有,不可信其無”。為了防止(特別是與簽名/密碼驗證等相關的操作)被?timing attack,目前各大語言都提供了相應的安全比較函數。各種軟件系統(例如 OpenSSL)、框架(例如 Play)的實現也都采用了這種方式。

例如 “世界上最好的編程語言”(粉絲較少,評論區應該打不起架來)—— php中的:

//?Compares?two?strings?using?the?same?time?whether?they're?equal?or?not. //?This?function?should?be?used?to?mitigate?timing?attacks;? //?for?instance,?when?testing?crypt()?password?hashes. bool?hash_equals?(?string?$known_string?,?string?$user_string?)//This?function?is?safe?against?timing?attacks. boolean?password_verify?(?string?$password?,?string?$hash?)

其實各種語言版本的實現方式都與上面的版本差不多,將兩個字符串每一位取出來異或(^)并用或(|)保存,最后通過判斷結果是否為 0 來確定兩個字符串是否相等。

如果剛開始沒有用?safeEquals?去實現,后續的版本還會通過打補丁的方式去修復這樣的安全隱患。

例如?JDK 1.6.0_17 中的Release Notes[1]中就提到了MessageDigest.isEqual?中的bug的修復,如下圖所示:

MessageDigest timing attack vulnerabilities

大家可以看看這次變更的的詳細信息openjdk中的 bug fix diff[2]為:

MessageDigest.isEqual計時攻擊

Timing Attack 真的可行嗎?

作者覺得各大語言的 API 都用這種實現,肯定還是有道理的,理論上應該可以被利用的。這不,學術界的這篇論文就宣稱用這種計時攻擊的方法破解了?OpenSSL 0.9.7?的RSA加密算法了。

Remote Timing Attacks are Practical[3]?論文中指出(我大致翻譯下摘要,感興趣的同學可以通過文末鏈接去看原文):

計時攻擊往往用于攻擊一些性能較弱的計算設備,例如一些智能卡。我們通過實驗發現,也能用于攻擊普通的軟件系統。本文通過實驗證明,通過這種計時攻擊方式能夠攻破一個基于 OpenSSL 的 web 服務器的私鑰。結果證明計時攻擊用于進行網絡攻擊在實踐中可行的,因此各大安全系統需要抵御這種風險。

最后,由于作者并非專研安全方向,以上描述是基于作者本人的理解,歡迎各位留言一起討論!

推薦閱讀
  • 不知道路由器工作原理?沒關系,來這看看!看不懂你捶我 | 原力計劃

  • 秋名山老司機從上車到翻車的悲痛經歷,帶你深刻了解什么是 Spark on Hive!| 原力計劃

  • 出道50年+!乘風破浪的編程語言們,能二次翻紅嗎?

  • Service Mesh 如何重定義云原生計算?阿里服務網格技術大揭秘

  • 國士無雙:賣掉美國房子,回國創辦姚班,他只為培養一流的程序員!

  • 萬字長文帶你入門 GCN

真香,朕在看了!

總結

以上是生活随笔為你收集整理的这 10 行比较字符串相等的代码给我整懵了,不信你也来看看的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 亚洲高清无码久久久 | 亚洲3p | 蜜桃视频一区二区三区在线观看 | 日韩激情在线 | 日韩中文字幕在线播放 | 欧美极品一区二区 | 影音先锋欧美在线 | 日韩少妇诱惑 | 国产精品黄色网 | 最近中文字幕一区二区 | 国产一区二区三区免费在线观看 | 色播基地| 欧美亚洲在线观看 | 日本韩国在线播放 | 国产成人综合久久 | 午夜精品一区二区三区免费视频 | 久久毛片视频 | 国产一区二区三区播放 | 欧美第十页 | 日韩成人av网 | 男人天堂资源 | 国产在线视频一区二区三区 | 久久久久久久黄色 | 可以免费观看av的网站 | 一区二区三区精品免费视频 | 九月婷婷| 国产精品一二三区视频 | 欧美a∨| 午夜精品视频在线观看 | 欧美精品乱码99久久蜜桃 | 开元在线观看视频国语 | 国产午夜精品久久久久久久久久 | 黄色香蕉网站 | 岛国二区三区 | 凹凸视频一区二区 | 三级性生活视频 | 秋霞av一区二区三区 | 男人天堂视频网站 | 特黄aaaaaaa片免费视频 | 亚洲啊v在线 | 国产精品一区二区电影 | 久久久久激情 | 欧美视频一区二区在线观看 | 国产精品蜜臀av | 99riav国产在线观看 | 久久国产欧美日韩精品 | 91丨九色 | 精品无码一区二区三区电影桃花 | 少妇av导航 | 国产av天堂无码一区二区三区 | 羞羞动态图 | 久久影院国产 | 久久精品www人人爽人人 | 国产成人亚洲精品无码h在线 | 玖草视频在线 | 日韩国产精品一区 | avav亚洲 | 玖玖爱这里只有精品 | 713电影免费播放国语 | 亚洲一级二级三级 | 免费在线观看成人av | 2023毛片 | 中文字幕免费视频观看 | 国产成人精品在线视频 | 久久av无码精品人妻出轨 | 人人看人人做 | 日韩一区二区三区免费 | 欧美混交群体交 | 国产成人精品网 | 亚洲一区免费 | 日本www高清视频 | 国产女主播一区 | 色爱视频| 国产综合网站 | 涩涩屋视频在线观看 | 亚洲精品视频播放 | 天海翼视频在线观看 | www.人人干 | 国语对白少妇spa私密按摩 | 91成人精品一区在线播放 | a天堂中文字幕 | 亚洲视频观看 | 91精品人妻一区二区三区蜜桃2 | 亚洲成熟少妇 | 国产区网址 | 日日爱666| 欧美伦理一区二区三区 | japanese在线观看 | 国产色拍 | 国产精品成人99一区无码 | 久久精品无码中文字幕 | 午夜精品福利在线观看 | 欧美性视频在线播放 | 成人靠逼视频 | 欧美色图亚洲色 | 午夜精品久久久久久久久久久久 | 亚洲欧美国产精品专区久久 | 97人人爽人人爽人人爽 | 操小妹影院 |