日韩性视频-久久久蜜桃-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 行比较字符串相等的代码给我整懵了,不信你也来看看的全部內容,希望文章能夠幫你解決所遇到的問題。

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

主站蜘蛛池模板: 国产精品久久9 | 中文字幕av在线免费观看 | 乱视频在线观看 | 欧美精品一区二区三区久久久竹菊 | 日韩中文字幕网址 | 久久99精品久久久久子伦 | 99九九热| 激情四射综合网 | 中文字幕一区二区三区日韩精品 | 91福利在线免费观看 | 好色综合 | 一区二区三区在线观看av | 欧美成人精品 | 亚洲美女福利 | 亚洲色图影院 | 亚洲日本三级 | 午夜精品视频一区二区三区在线看 | 日本黄色一级网站 | 精品欧美乱码久久久久久1区2区 | 黄色三极片 | 亚洲风情亚aⅴ在线发布 | 无码人妻精品一区二区三区66 | 欧美一区二区最爽乱淫视频免费看 | 国产尤物在线 | 高潮一区二区 | 国产在线观看免费av | 男女草逼网站 | 国产精品久久欧美久久一区 | 国产精品网页 | 一区二区三区四区在线免费观看 | 开心综合网 | 国产探花在线观看 | 午夜精品久久久久久久久 | 情侣作爱视频网站 | 99久久99久久久精品棕色圆 | 色视频网站在线观看 | 岛国一区 | 成年人网站在线观看视频 | 米奇影音| 337p日本欧洲亚洲大胆张筱雨 | 制服丝袜国产在线 | 五月天六月婷婷 | 欧洲精品一区二区三区久久 | 污视频网站在线看 | 男人插女人免费视频 | 成人国产在线 | 亚洲一久久 | 日韩无码精品一区二区 | 亚洲www视频 | 国产高清视频在线免费观看 | 中国av一区 | 天天躁夜夜躁狠狠是什么心态 | 四虎黄色影视 | 春色导航| 青春草久久 | 蜜桃成人av | 国产视频精品久久 | 体内精69xxxxxx | 精品日韩一区二区 | 一级中文片 | 91桃色视频| 91精品久久久久久久99蜜桃 | 亚洲自拍av在线 | 国产草草影院ccyycom | 国产视频欧美视频 | 日韩黄色免费观看 | 亚洲精品一线二线三线 | 国产中文字幕乱人伦在线观看 | 黄色xxxx | 一本之道高清无码视频 | 一个人在线观看免费视频www | 日韩porn| 一区二区国产视频 | 天天爽夜夜爽夜夜爽 | 国产精品呻吟 | 蜜桃9999 | 亚洲欧洲精品成人久久奇米网 | 精品国产aⅴ一区二区三区四川人 | 免费国产一区二区三区 | 欧美激情片在线观看 | 男人的天堂影院 | 青青草国产成人av片免费 | 一区二区三区av | 中文字幕高潮 | 人妻少妇偷人精品久久性色 | 李丽珍毛片 | 天天鲁一鲁摸一摸爽一爽 | 久久久久久久久久久久久国产 | 奇米影视四色在线 | 免费看a网站 | www.自拍 | 免费吃奶摸下激烈视频 | 玖玖爱av| 日本免费一级片 | 毛片在哪里看 | 国产又色又爽又黄的 | 污污视频网站在线免费观看 | jizz视频 | 日日爱网站 |