ãããã®åãããã¯ãŒã¯ã¯ç°åžžã«é«ãããã©ãŒãã³ã¹ãæã¡ãæ°çŸäžã®ããŒããå«ãŸããŠããŸãã ããããã®ããã©ãŒãã³ã¹ã¯ãã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒã®ããã©ãŒãã³ã¹ã«å¹æµããŸãã
- Rosetta @ home-110 TFlops以äž
- Einstein @ Home-355 TFlops以äž
- SETI @ home-560ãã©ããããã¹ä»¥äž
- BOINC-5.6 Pflops以äž
- ãã©ãŒã«ãã£ã³ã°@ããŒã -5.9 Pflops以äž
- ãããã³ã€ã³-9.4 Pflops以äž
- ãã«ãŒãžãŒã³/ LïŒ2006ïŒ-478.2 TFlops
- ãžã£ã¬ãŒïŒã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒïŒïŒ2008ïŒ-1.059 Pflops
- IBM RoadrunnerïŒ2008ïŒ-1.042 Pflops
- ãžã£ã¬ãŒã¯ã¬ã€XT5-HEïŒ2009ïŒ-1.759 Pflops
- Tianhe-1AïŒ2010ïŒ-2.507ãããã
- IBM SequoiaïŒ2012ïŒ-20ãããã
2010幎æ«ã®æšå®ã«ãããšãçŽ20å人ã®ã€ã³ã¿ãŒããããŠãŒã¶ãŒïŒ20å人ïŒãããŸããã
åãŠãŒã¶ãŒã¯ãå°ãªããšã8 GflopsïŒAMD Athlon 64 2.211 GHzïŒã®ããã©ãŒãã³ã¹ãæã€å°ãªããšã1ã€ã®ããã»ããµãŒã³ã¢ãæã£ãŠããŸãã
ç°¡åãªæ°åŠçèšç®ã«ãããšããã®ãããªãããã¯ãŒã¯ã®ããã©ãŒãã³ã¹ã¯æ¬¡ã®ããã«ãªããŸãã
8 * 10 9 * 2 * 10 9
= 16ãšã¯ãµããããã¹ ïŒ10 18 ïŒã
ãã®ãããªãããã¯ãŒã¯ã¯ããŸã æ§ç¯ãããŠããªãIBM SequoiaïŒ2012ïŒã®800åãBitcoinãããã¯ãŒã¯ã®1700åããã¹ãŠã®ã¹ãŒããŒã³ã³ãã¥ãŒã¿ãŒãšã³ã³ãã¥ãŒã¿ãŒãããã¯ãŒã¯ãçµã¿åãããå Žåãããçç£æ§ãé«ããªããŸãã çŸåšãPCãŠãŒã¶ãŒãšã€ã³ã¿ãŒããããŠãŒã¶ãŒã®æ°ãå¢ããŠãããã³ã¢ã®æ°ãå¢ããŠããŸãã ãã¡ããããã®æ°ïŒ16ãšã¯ãµããããã¹ïŒã¯çæ³çã§ãã ãã24æé365æ¥ãèšç®ããŸããããåãŠãŒã¶ãŒã1æ¥ã«å°ãªããšã2åãèšç®ãããšïŒååãšããŠå®éãããé·ãïŒããã®ãããªãããã¯ãŒã¯ã¯IBM Sequoiaãšæ¯èŒãããŸãã
æè¿ã§ã¯ãJavaScriptã®åæ£ãã©ãŠã¶ã³ã³ãã¥ãŒãã£ã³ã°ãããã¯ãŒã¯ã¯çŸå®ã®ãã®ã§ã¯ãããŸããã
ãã®èšäºã¯1幎åã®ç§ã®èšäºã®è«ççãªç¶ãã§ãïŒ Javascriptã§ã®åæ£ã³ã³ãã¥ãŒãã£ã³ã°
1幎åã«äœãå€ãã£ãã®ãã1幎åã«ã³ã³ãã¥ãŒã¿ãŒãããã¯ãŒã¯ãäœæã§ããªãã£ãã®ã¯äœã§ããïŒ
1幎ã§ã»ãšãã©ãã¹ãŠã®åªãããã©ãŠã¶ãŒã¯ãWebWorkersãlocalStorageãSQL DBãIndexedDBãåãåããŸããã ã¡ã€ã³ã¹ã¬ããã§JavaScriptãèšç®ãã1幎åã«Flash Storageã䜿çšããããšã劚ãããã®ã¯äœããããŸããã§ããããã¡ã€ã³ã¹ã¬ããã§ã®èšç®ã¯é©ãã¹ãé ãã®åå ã§ãããFlash Storageã®å®¹éã¯éãããŠããŸãã 1幎åã«ã¯ãé害ã®ããåæ£ãããã¯ãŒã¯ãlaguyãcrutchãintrusiveããããŸããã
ããã§ãWebWorkersã䜿çšããŠã1çªç®ã®ããã»ããµã³ã¢ã®ãªãœãŒã¹ã100ïŒ äœ¿çšã§ããŸãã2ã€ã®ã¯ãŒã«ãŒã2ã€ã®ã³ã¢ã®å ŽåïŒã³ã¢éã®äœæ¥ã®åæ£ã¯ãç¹å®ã®ãã©ãŠã¶ãŒã§ã®ã¯ãŒã«ãŒã®å®è£ ã«äŸåããŸãïŒã æ ŒçŽãããããŒã¿ã®éã«å®è³ªçã«å¶éã¯ãããŸããïŒ50MB IndexedDBïŒFirefoxïŒ+ 5MB localStorage +ãã®ä»ã®ã¹ãã¬ãŒãžã ãããã®55 + MBã¯ãã¿ã¹ã¯ããŒã¿ãšäžéããŒã¿ãä¿åããã®ã«ååã§ãã 2011幎ã®2010幎ã®çµããã«ãNode.jsã¯ããã«ç°åžžãªç¶æ ã«ãªãå§ããŸããã ããã¯ãåæ£ã³ã³ãã¥ãŒãã£ã³ã°ãµãŒããŒã«æé©ãªãœãªã¥ãŒã·ã§ã³ã ãšæããŸãã
é©åãªãã¯ãããžãŒNode.js + WebWorkers + localStorage + IndexedDBã 2,000,000,000人ã®ã€ã³ã¿ãŒããããŠãŒã¶ãŒãå¢å ããŠããŸãã ã³ã¢ã®æ°ã¯å¢å ããŠãããçç£æ§ã¯åäžããŠããŸãã æ¯æããã©ãŠã¶ã¯ã©ãã©ãé«éã«ãªã£ãŠããŸãã ä»ããã16ãšã¯ãµããããã¹ã®æªäœ¿çšå®¹éã®ã¹ããªãŒã ãæ£ããæ¹åã«åããæã§ãïŒ
ãããã¯ãŒã¯ã¯ã©ã€ã¢ã³ãã¯ã©ãã«åã蟌ãããšãã§ããŸããïŒ
ããŒãžã衚瀺ããŠããéãããã»ããµã¯10ã20ïŒ ã§ããŒããããYouTubeãããããªãèŠãŠããéãããã»ããµã¯30ã50ïŒ ã§ããŒããããŸãïŒãã以äžã¯èããŸããïŒã ããã»ããµãããŒãã§ããåºåãšè¿·æãªãã©ãã·ã¥ãããŒãç£èŠããå¿ èŠããããŸãã è¿·æãªãããŒãåºåã衚瀺ãã代ããã«ãåè¡ãèšç®ããããã«æ±ããããŸããYouTubeãããããªãèŠèŽãããã®æç¹ã§ãã©ãŠã¶ãŒã¯Folding @ homeã®ã¿ã³ãã¯è³ªæãããã¿ãèšç®ããŸãã ãæ°ã«å ¥ãã®ãã¡ã€ã«ãã¹ãã£ã³ã°ãµãŒãã¹ãããã¡ã€ã«ãããŠã³ããŒãããŠãããšãã«ããã©ãŠã¶ãæçšãªãã®ãèšç®ããŠããéãåºåãèŠãªãããšãæ³åããŠãã ããïŒadBlockã«ã€ããŠã¯ããç¥ã£ãŠããŸãïŒã ãã®èšäºãèªãã§ãããšãã«ããã©ãŠã¶ãæçšãªãã®ãèšç®ããŠãããšæ³åããŠãã ããã ããã«ããµã€ãã«ã¢ã¯ã»ã¹ããåãŠãŒã¶ãŒã¯ããµã€ãã«åœ¹ç«ã€äœãã瀟äŒã«åå ¥ãå©çãããããããšãã§ããäœããããŸãã ãŠãŒããã¢ã§ãããå®çŸå¯èœã§ãã
äœãèšç®ã§ããŸããïŒ
æ°å€ã®ãããå€ãå¿ èŠãšããã¿ã¹ã¯ïŒåŸ¹åºçãªæ€çŽ¢ã®ã¿ã¹ã¯ããã¥ãŒã©ã«ãããã¯ãŒã¯ã®ãã¬ãŒãã³ã°ãªã©ã ã¢ã ããŒã«ã®æ³åã«ããã°ãåæ£ã³ã³ãã¥ãŒãã£ã³ã°ã¯ã¿ã¹ã¯ã«é次èšç®ããªãå Žåã«ã®ã¿æãå¹æçã§ããããã䞊åèšç®ãããŸãã ããããŒãã®èšç®ã¯ãå¥ã®ããŒãã®ããŒã¿ã«äŸåããŸããã
é¢çœãïŒ ãã®ãããªãããã¯ãŒã¯ãäœããŸãããïŒ
åæ£ã³ã³ãã¥ãŒãã£ã³ã°ã®äŸïŒmd5ããã·ã¥ããã®ãã¹ã¯ãŒãæšæž¬
äŸã§ã¯ããã®ã¿ã¹ã¯ã«éžæã§ãããããã¯ãŒã¯ã¢ãŒããã¯ãã£ã瀺ããŸãã md5ããã·ã¥ããé·ãã8æå以äžã®ã¢ã«ãã¡ãããã96æå以äžã®ã¢ã«ãã¡ããããéžæããŸãã äœããã®æ¹æ³ã§åé¡ã培åºçãªæ€çŽ¢ã«ãã£ãŠã®ã¿è§£æ±ºãããããšã¯æããã§ãã ãã¹ã¯ãŒãèŸæžãããªãããŒãªã¹ããŒã ã¯äœ¿çšããŸãã-ãã ã€ã¶ããŸãã
ã¿ã¹ã¯é åž
æ倧96 8åã®æœåšçãªãã¹ã¯ãŒãããããŸãã åãã¹ã¯ãŒãã«1ãã96ãŸã§ã®10é²æ³ã§æ°åãä»ããŸãããã çŸåšãåãã¹ã¯ãŒãã¯ãããªãããŒãªå€æãšã¢ã«ãã¡ãããã䜿çšããŠã
from10toN
ã96
from10toN
ïŒ
from10toN
ïŒã«å€æããããšã§ååŸã§ããŸãã
var alphabet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKL" + "MNOPQRSTUVWXYZ+/*-\\?=`~!@#$%^&*()_{}[];:'\"|.,<> ", alphabetLength = alphabet.length; function from10toN (number, base) { if (!base || base > alphabetLength) { base = alphabetLength; } if (base < 2) { base = 2; } var result = ''; while (number > 0) { result = alphabet.charAt(number % base) + result; number = Math.floor(number / base); } return result; }
åã¿ã¹ã¯ã«ã¯ãéžæã®ããã«400,000åã®ãã¹ã¯ãŒãã®ééãå«ãŸããŸãïŒGoogle Chromeã¯1ç§éã«çŽ200,000 md5ãèšç®ããŸãïŒã åèšã§ã18034739475ã®ã¿ã¹ã¯ããããŸã-å€ãã®å Žåã16æåã®ãã¹ã¯ãŒãã®å Žåã»ã©çµ¶æçã§ã¯ãããŸãã...ã¯ã©ã€ã¢ã³ããã¿ã¹ã¯ãåŒãåããããå®äºããªãã£ãå¯èœæ§ããããŸãã ã¿ã¹ã¯ããšã«ãæå¹æéãåãããŸã§ã®æéãè¿œå ããŸã-æå¹æéã
ãããã¯ãŒã¯ã¯ã©ã€ã¢ã³ãã®ããžãã¯ã¯åºæ¬çã§ããmd5ãèŠã€ãããã³ã«N1ããN2ã®ãã¹ã¯ãŒãã䞊ã¹æ¿ãããµã€ã¯ã«ã§ãåä¿¡ããããã·ã¥ãæšæºãšæ¯èŒããŸãã ããã·ã¥ãäžèŽããå Žåããã¹ã¯ãŒãããµãŒããŒã«éä¿¡ããããã§ãªãå Žåã¯ç©ºã®è¡ãéä¿¡ããŸãã
EcdcWorker.prototype.calculateSync = function (id, data) { var maxPasswordId = data.max, password, alphabetBase = data.base, hash = data.hash; for (var i = data.min; i <= maxPasswordId; i++) { // // md5 password = from10toN(i, alphabetBase); if (md5(password) === hash) { // tada! return {id: id, data: password}; // } } return {id: id, data: ""}; // };
顧客ããžãã¯
1.ã¯ã©ã€ã¢ã³ãããµãŒããŒã«ã¢ã¯ã»ã¹ãããã°ã€ã³ããŸã
2.ã¯ã©ã€ã¢ã³ããã³ã³ãã¥ãŒãã£ã³ã°ã¹ã¯ãªããããã³ãã®ä»ã®äžéããžãã¯ãããŒãããŸã
3.ã¯ã©ã€ã¢ã³ãã¯ãå»æ¢ãããã¿ã¹ã¯ããªããžããªããåé€ããŸã
4.ã¯ã©ã€ã¢ã³ãã¯ã¯ãŒã«ãŒãèµ·åããŸãïŒãã®æ°ã¯èšå®ã«ãã£ãŠç°ãªããŸãïŒ
5.ã¯ã©ã€ã¢ã³ãã¯ãå®äºããããµãŒããŒã«é ä¿¡ãããªãã£ãïŒãªããžããªå ã®ïŒã¿ã¹ã¯ã確èªããŸã-ãããã®ã¿ã¹ã¯ãã¯ãŒã«ãŒçµç±ã§éä¿¡ããŸã
6.åã¯ãŒã«ãŒã¯ãµãŒããŒããã¿ã¹ã¯ãèŠæ±ããããã¯ã©ã€ã¢ã³ããä»ããŠã¹ãã¬ãŒãžããæªåŠçã®ã¿ã¹ã¯ãååŸããŸãïŒ1ã€ä»¥äžïŒ
7.ã¯ã©ã€ã¢ã³ãã¯ãã¿ã¹ã¯ããªããžããªã«ä¿åããŸãïŒããŒãžããªããŒããããå ŽåïŒ
8.åã¯ãŒã«ãŒã¯èªåã®ã¿ã¹ã¯ãèšç®ãå§ããŸã
9.ã¿ã¹ã¯ã®èšç®ãå®äºãããšãã¯ãŒã«ãŒã¯ãœãªã¥ãŒã·ã§ã³ããªããžããªã«ä¿åããŸãïŒããŒãžããªããŒãããããããµãŒããŒãå©çšã§ããªãå ŽåïŒ
10.ã¯ãŒã«ãŒã¯ãµãŒããŒã«ãœãªã¥ãŒã·ã§ã³ãéä¿¡ããŸãïŒãã€ã³ã6以éïŒã
ã¯ã©ã€ã¢ã³ããã¿ã¹ã¯ãå®è¡ããŠããéãä»ã®ã¯ã©ã€ã¢ã³ãïŒåããã©ãŠã¶ãŒã®ä»ã®ããŒãžã®ã¹ã¯ãªããïŒã¯ãããã¯ãããŸãã
ãµãŒããŒããžãã¯
1.ãµãŒããŒã¯ã¯ã©ã€ã¢ã³ããèªèšŒããŸã
2.ã¯ãŒã«ãŒããã¿ã¹ã¯ãªã¯ãšã¹ããéä¿¡ãããŸã-ãµãŒããŒã¯å»æ¢ãããã¿ã¹ã¯ããã§ãã¯ããååšããå Žåã¯ã¯ã©ã€ã¢ã³ãã«éä¿¡ããŸã
2.1ã å»æ¢ãããã¿ã¹ã¯ããªãå Žå-æ°ããã¿ã¹ã¯ãäœæããã¯ã©ã€ã¢ã³ãã«éä¿¡ããŸã
3.ã¯ãŒã«ãŒã¯ã¿ã¹ã¯ã«å¿çãéä¿¡ããŸã-ãµãŒããŒã¯å¿çã確èªããã¿ã¹ã¯ã«å®äºã®ããŒã¯ãä»ããŸã
3.1ã ãµãŒããŒã¯æ°ããã¿ã¹ã¯ãã¯ãŒã«ãŒã«éä¿¡ããŸãïŒãã€ã³ã2ãããªã©ïŒã
4.ãµãŒããŒãã¯ãŒã«ãŒããæ£ããçããåãåããšããã«ããµãŒããŒã¯åäœãåæ¢ããŸãã-ã¿ã¹ã¯ãçºè¡ããŸãã
äžè¬çãªã¹ããŒã
[Workers: EcdcWorker] / \ Tasks: XHR / \ Messages: postMessage / Page: html \ [Server: EcdcServer] ------------ [Browser: EcdcClient] --- [User] | | [Database: Any] [Storage: localStorage]
äžèšã¯MD5 BrutforsãµãŒããŒã®åäœã®ç°¡åãªå³ã§ããããåæ£ã³ã³ãã¥ãŒãã£ã³ã°ãããã¯ãŒã¯ãæ§ç¯ããããã®ãã¬ãŒã ã¯ãŒã¯ã䜿çšããŠå³ãå®è£ ããããšã¯å®éã«å¯èœã§ãJavaScript ECDC
çµæ
ããã§ç§ã«èµ·ãã£ãããšãèŠãããšãã§ããŸãïŒ md5ããã·ã¥ãããã¹ã¯ãŒãããã«ãŒãµãŒã㌠ïŒãããªãã¯äžæ£ã§ãããã°ã€ã³ããšããã¡ãã»ãŒãžãåããŠååŸãããšãïŒã ä»»æã®é»åã¡ãŒã«ãŸãã¯ä»»æã®ååã䜿çšã§ããçµ±èšãä¿æããããã«äœ¿çšãããŸã-èšç®éãžã®è²¢ç®ïŒmd5ããã·ã¥ãšããŠä¿åïŒ ã
ãã¹ã¯ãŒãã®çµ±èšæ å ±ã¯ããã«ãããŸã ïŒèš±å¯ãå¿ èŠã§ãïŒã
ãããã¯ãŒã¯ã¯ã©ã€ã¢ã³ãã¯ãWorkersãlocalStorageãJSONãXMLHttpRequestããµããŒããããã©ãŠã¶ãŒã§ã®ã¿åäœããŸãã ãããªãã¯md5ãèšç®ããŠããŸãããšãããã¬ãŒãºãå ¥åãããšãèšç®ã«é¢äžããããšã«ãªããŸãã ç§ã¯åŽåè ã®ä»äºã®ãã°ããªã³ã«ããŸãããããªãã¯åœŒããã©ããªã³ã³ãœãŒã«ã§äœãããŠããã®ããèŠãããšãã§ããŸãã
ããŒãžã«èšç®ãã¬ãŒã ãåã蟌ãããšãã§ããŸã;ãã®ã³ãŒãã¯ã¡ã€ã³ããŒãžã®ãœãŒã¹ã«ãããŸãã
åç §è³æ
1. ãã¹ã¯ãŒãæšæž¬ãµãŒããŒã®åäœäŸ
2. ãã¹ã¯ãŒãéžæã®çµ±èš ïŒäž»ãªãã®ã«ã¯æ¿èªãå¿ èŠã§ãïŒ
3. åæ£ã³ã³ãã¥ãŒãã£ã³ã°ãããã¯ãŒã¯ãäœæããããã®JavaScriptãã¬ãŒã ã¯ãŒã¯
4.äŸã®ãµãŒããŒãœãŒã¹ã³ãŒãïŒ md5-bruteforce-server.js ã md5-bruteforce-server /
ãããã«
ã·ã¹ãã ã¯ããã®å®è¡å¯èœæ§ã蚌æããŸããïŒãã¹ãã§ã¯ã3æåã®ãã¹ã¯ãŒããéžæããŸããããçå£ã«ïŒïŒãããŒãã¹ã¿ãŒã®ãã¹ãã£ã³ã°ã®å¯èœæ§ã確èªããããã«ãååãªéã®ãŠãŒã¶ãŒã§ãã¹ãããããšã«å€ããã¯ãããŸããã
åæ£ã³ã³ãã¥ãŒãã£ã³ã°ã«åå ããŠããŸããïŒ ãã©ãŠã¶ã®åæ£ã³ã³ãã¥ãŒãã£ã³ã°ãããã¯ãŒã¯ã«ã¯æªæ¥ããããšæããŸããïŒ åºåãèŠããYouTubeãããªãèŠããããã®ã§ã¯ãªããäœãæçšãªãã®ãèšç®ãããã§ããïŒ
æ¹å€ãææ¡ãææ¡ã¯å€§æè¿ã§ãïŒ