ãã®ãããžã§ã¯ãã¯ã³ãã¥ããã£ãã奜è©ãåããŠããããã°ããã®éHNã®ãããã«äœçœ®ããŠããŸãã ãã£ãŒãããã¯ãããããšãã
ãªãªãŒã¹åŸãããŒã¿ããŒã¹å ã®ãã¹ã¯ãŒããããã·ã¥ããããã«äœ¿çšããããã·ã¥é¢æ°ã倿Žããããã®ããã€ãã®ãªã¯ãšã¹ããåãåããŸããã
# Turn the password into an hashed one, using # SHA1(salt|password). def hash_password(password) Digest::SHA1.hexdigest(PasswordSalt+password) end
ãã®ã³ãŒãã¯ãSHA1ãšãœã«ãã䜿çšããŠããŸãã èªè ãææããããã«ãSHA1ãéåžžã«è¿ éã«èšç®ããæ¹æ³ããããããããã¯æãå®å šãªéžæã§ã¯ãããŸããã ãã°ããããŠã人ã ã¯ã€ã¶ãããã³ã¡ã³ãã«åãæã䜿çšãå§ããŸããïŒãBCryptã䜿ããã ã³ãŒãã«æ°ããäŸåé¢ä¿ã远å ãããªãããã«ãã«ãŒãå ã§ãã¹ããããSHA1ã䜿çšããããšããå§ãããŸãïŒREADMEã確èªããå Žåãç®æšã®1ã€ã¯ãã³ãŒããåçŽã«ããäŸåé¢ä¿ãã§ããã ãå°ãªãããããšã§ãïŒã ãããŠãããã¯èµ·ãããŸããïŒæå·åã®æçŸ©ã æå·ããªããã£ããšãã®å¯èœãªã¢ããªã±ãŒã·ã§ã³ããã³çµã¿åããã«ã€ããŠã¯è°è«ãããæãã«ããBCryptã䜿çšãããŠãã ããã ãããã®åå¿ã®ç®ã«ã¯ãããã°ã©ããŒã¯æå·åã«ã€ããŠæ±ºããŠèªãããšã®ã§ããªãã¬ã€ãã©ã€ã³ãå®è¡ããæããªãããŒã³ã«ãããŸããã ããããããã«ã€ããŠã¯åŸã§...
å°ãæ»ã£ãŠããã®ãã¹ãŠã®å ã®åé¡ãšããã®ã³ãŒãã®å®å šæ§ãèŠãŠã¿ãŸãããã
åé¡
ãã®åé¡ã¯ããªãç°¡åã«çè§£ã§ããŸããã詳现ã«èª¬æããŸãã ãã¹ã¯ãŒããå¹³æã§ããŒã¿ããŒã¹ã«ä¿åããªãããã«ãéåžžã¯ããã·ã¥ãããŸãã
HP = HASH (password) # HP â hashed password,
ãµãŒããŒéšåããŠãŒã¶ãŒãèªèšŒããå¿ èŠãããå Žåããã¹ã¯ãŒããå¹³æã§åãåããå床ããã·ã¥ããããŒã¿ããŒã¹ã«ãããã¹ã¯ãŒããšæ¯èŒããŸãã äžèŽããå ŽåãèªèšŒã¯æåã§ãã
ããããæ»æè ïŒã€ãã«é»è©±ãããïŒãããŒã¿ããŒã¹ãã³ããååŸããå Žåã¯ã©ããªããŸããïŒ Evaã¯ããã·ã¥åããããã¹ã¯ãŒãã®ã»ãããæã£ãŠããŸããHP1ãHP2ãHP3ãªã©ãšåŒã³ãŸãããã圌女ã®ç®æšã¯ãHPãPã«æ»ããããªæ»æãèŠã€ããããšã§ãã
ããã·ã¥ã¢ã«ãŽãªãºã ã¯å ¬éãããŠãããããEveãæåã«ãã¹ãããšã¯ãäžè¬çãªåèªã§æ§æãããèŸæžã«é©çšããããšã§ãã ãã®ãããªåèªã®ããã·ã¥ãããŒã¿ããŒã¹ã«ãããã®ãšäžèŽããå Žåããã¹ã¯ãŒããèŠã€ãããŸãã è±èªã«ã¯å€ãã®åèªããªãããããã®æ»æã¯éåžžã«ç°¡åãã€è¿ éã«å®è¡ã§ããããšã«æ³šæããŠãã ããã
ãããããããããŠãŒã¶ãŒã§ããããã¯ãèŸæžã«ãªããã¹ã¯ãŒããéžæããããŸãé·ãã¯ãããŸããã
Eveã¯ãããšãã°æå€§6æåã®ãã¹ã¯ãŒãã®ãã¹ãŠã®çµã¿åãããçæããããã·ã¥ãèšç®ã§ããŸãã ãã®æ»æã¯ããè€éãªèšç®ã§ãã ãã¹ã¯ãŒãããããšãã°6æåã®ãã€ããªæååã§ããå Žåãåèš256 ^ 6ã®çµã¿åãããã€ãŸã281474976710656ããããŸãã
æ»æè ãæ¯ç§10ååã®ããã·ã¥ãèšç®ã§ããå ŽåïŒææ°ã®GPUã§ã¯ãããèš±å¯ãããŠãããç Žãå¿ èŠã¯ãããŸããïŒããã®ãã¹ã¯ãŒãããããã³ã°ããã«ã¯æ¬¡ãå¿ èŠã§ãã
281474976710656 / 1000000000 = 281474
ããã3æ¥ããŸãã¯å¹³åã§ååã§ãã è¯ããªãïŒ ç°¡åãããã ãã1ã€ã®åé¡ããããŸãããŠãŒã¶ãŒã256æåãã¹ãŠãåã確çã§äœ¿çšããå¯èœæ§ã¯äœãã§ãã ææªã®å ŽåãèããŠã¿ãŸããããå°æåã¯26æåã®ã¿ã§ãæ°åããã®ä»ã®æåã¯ãããŸããã ä»åã¯8æåã®ãã¹ã¯ãŒãã䜿çšããŸãã
ãã¹ã¯ãŒãã¯26 ^ 8ãã€ãŸã208 827 064 576ã§ããä»åã¯ã208ç§ã§ãã¹ã¯ãŒããè§£èªã§ããŸãïŒå¹³åã§ãã®æéã®ååïŒã
ããã¯ééããªãè¯ããããŸããã æ¯ç§10ååã®ããã·ã¥ãèšç®ã§ããæ»æè ãã¢ã¯ã»ã¹ã§ããªãããã«ããããã«ãã¢ã«ãã¡ãããã®ãã¹ã¯ãŒãã¯ã©ã®ãããã®é·ãã«ããå¿ èŠããããŸããïŒ
å¹³å1024幎ã§14æåãéžæãããŸãã 16æåã®å Žåãæ»æè ã¯1382824幎ãè²»ããå¿ èŠããããŸãã 12æåã¯1幎åïŒå¹³åããŠïŒæµæããŸãããããã¯ã»ãšãã©ã®ã¢ããªã±ãŒã·ã§ã³ã§ã¯ééããªãååã§ã¯ãããŸããã
ã§ã¯ãSHA1ã¯ãã¹ã¯ãŒãããã·ã¥ã«å¯ŸããŠå®å šã§ããïŒ ã¯ãããŠãŒã¶ãŒã14æå以äžã®åŒ·åãªãã¹ã¯ãŒããéžæããå Žåã ããã§ãªããã°ãéåžžã«å®å šã§ã¯ãããŸããã ããã¯ãã¹ãŠãã¹ã¯ãŒãã®é·ãã«äŸåãããŠãŒã¶ãŒãçããŠåŒ±ããã¹ã¯ãŒããæŸããšããæªãç¿æ £ãæã£ãŠããããšã¯ç§å¯ã§ã¯ãããŸããã
ããããããã¯ããã«æªã
æ®å¿µãªãããå®éã«ã¯ããã¹ãŠãæªåããŠããŸãã ããšãã°ã12åã®ãã¹ã¯ãŒãæåã«å¯Ÿããæ»æã¯å³åº§ã«å®è¡ã§ããŸããçŽ3幎ãããŠãã¹ãŠã®çµã¿åããã®ããã·ã¥ãèšç®ããP-> HPã®åœ¢åŒã®ããŒãã«ã«æžã蟌ãããšãã§ããŸãã
ãã ãããã®ãããªããŒãã«ã¯å€ãã®ã¹ããŒã¹ïŒæ£ç¢ºã«ã¯86,792ãã©ãã€ãïŒãå æããŸãããŸããããã¯ãPãHPïŒéæäžå¯èœãªã¿ãŒã²ããïŒã®ãã¢ã«1ãã€ãããè²»ãããªãã»ã©ã³ã³ãã¯ãã«ããŒã¿ãä¿åããããšãæ³å®ããŠããŸãã ãã ããããŒãã«ã®ãµã€ãºãåççãªå¶éå ã«ããå Žåãããã¯æ¬åœã®è åšã§ãã
çµè«ãšããŠãå€ãã®å Žåãæå·åæ»æã§ã¯ãæéãããã代ããã«ãã¹ããŒã¹ãç ç²ã«ããŠå®è¡ã§ããŸãã
è¯ããã¥ãŒã¹ã¯ãåãã¢ã«ãŽãªãºã ã䜿çšããŠãã¹ãŠã®ãµã€ãã«é©ããåäžã®ããŒãã«ã®èšç®ãé²ãæ¹æ³ããããšããããšã§ãã å¡©ã䜿ãããšã§ãã Saltã¯ãããã·ã¥ããåã«ãã¹ã¯ãŒããšãšãã«è¿œå ããïŒãããªãã¯ïŒè¡ã§ãã ããšãã°ããœã«ãããlameãã§ãã¹ã¯ãŒãããfooãã®å Žåãèšç®ããŸã
HP = HASH ("foolame")
ãããã£ãŠãããŒãã«æ»æã®å ŽåãEveã¯åããœã«ãã䜿çšãããã¹ãŠã®ãã¹ã¯ãŒãã®çµã¿åããã®ããã·ã¥ãèšç®ããå¿ èŠããããŸãã ãã®ãããªããŒãã«ã¯ãç°ãªããœã«ãã䜿çšããå¥ã®ãµã€ããæ»æããã®ã«åœ¹ã«ç«ããªãã§ãããã
ã©ã³ãã ãœã«ã
ããå°ãæ¹åããŠãHPã ãã§ãªãã©ã³ãã ãœã«ããä¿åã§ããŸãã ãŠãŒã¶ãŒã®ã¢ã«ãŠã³ããäœæãããšãããŠãŒã¶ãŒã®ã©ã³ãã ãªãœã«ããçæããã¢ã«ãŠã³ãã«ä¿åããŸãã ãã®ã¢ãããŒãã§ã¯ãæ»æè ã¯åãŠãŒã¶ãŒã®ããŒãã«ãåå¥ã«èšç®ããå¿ èŠãããããããã¹ã¯ãŒãã¯ããã«å®å šã§ãã ãŸãããã1ã€ã®è峿·±ã芳å¯çµæããããŸããã°ããŒãã«ãªãœã«ãã1ã€ãããšããã¹ã¯ãŒããå®å šã§ãã£ãŠããæ»æè ã®æã«æž¡ãå¯èœæ§ãé«ããªããŸãã åã ã®å¡©ãããå Žåãããã¯ã»ãšãã©ãããŸããã
ããã·ã¥é¢æ°ãé ããã
ãã ãããã¹ãŠã®ããŒãã«ããŒã¹ã®æ»æã鲿¢ãããšããŠããæ ¹æ¬çãªåé¡ããããŸãããã¹ã¯ãŒããçããEvaã1ç§ããã10ååããã·ã¥ãèšç®ã§ããå Žåãåé¡ãçºçããŸãã
ãã®å Žåãäœããè¡ãããšãã§ããŸããé ãããã·ã¥é¢æ°ã䜿çšããŸãã
ãœãããŠã§ã¢ãšãââãŒããŠã§ã¢ã®äž¡æ¹ã®èšç®ãéåžžã«é ãã¢ã«ãŽãªãºã ããããŸãã ãŸãã¯ãæ¢åã®ã¢ã«ãŽãªãºã ã䜿çšããŠãã«ãŒãã§äœ¿çšããŠéåžžã«é ãããããšãã§ããŸãã
ããšãã°ãBlowfishã¯é ãããŒåé¢ã¢ã«ãŽãªãºã ã䜿çšããæå·åã¢ã«ãŽãªãºã ã§ãïŒã¢ã«ãŽãªãºã èªäœã¯ããŒã¹ã±ãžã¥ãŒãªã³ã°ãå®è¡ããåŸã¯éåžžã«é«éã§ãïŒããããã£ãŠãBlowfishã¯ãç°ãªãããŒã䜿çšããŠå€ãã®ã·ã§ãŒãã¡ãã»ãŒãžãæå·åããå Žåã«ã®ã¿é©ããŠããŸãããé«éã«ããããšãã§ããŸãã 1ã€ã®ããŒã§å€§ããªã¡ãã»ãŒãžãæå·åããå¿ èŠãããå ŽåïŒã
Blowfishã®ããŒå ±æã¢ã«ãŽãªãºã ãé ããšããäºå®ã¯ãBlowfishãHASHã«é©ããŠããããšã瀺ããŠããŸãã
ããã§ãããŒã«ã¹ã»ãããã¹ãšããããã»ããžãšãŒã«ã¯ããã¹ã¯ãŒãã®ããã·ã¥ã«äœ¿çšã§ããBcryptãšåŒã°ããã¢ã«ãŽãªãºã ãéçºããŸããã ãã®ã¢ã«ãŽãªãºã ã¯1999幎ã«å°å ¥ãããBlowfishã®ããŒåé¢ã¢ã«ãŽãªãºã ã®ä¿®æ£çã䜿çšããŠããŸãã BlowfishåæãBcryptã«é©çšã§ãããã©ããã¯ããããŸããã ãŸããBcryptèªäœãã©ã®çšåºŠåæããããããããªãããããã®ã¢ã«ãŽãªãºã ã®ã»ãã¥ãªãã£ã«ã€ããŠã³ã¡ã³ãããããšã¯ã§ããŸããã
ãã ããããã¯äžè¬çãªéžæè¢ã§ãããProvosãšMaziÚresã¯2äººã®æåãªæå·äœæè ã§ãããããã¢ã«ãŽãªãºã ã«ã¯æãããªæ¬ é¥ã¯ãããããããŸããã
ã¹ããŒããã·ã¥é¢æ°ã®äœ¿çšãéå§ãããšããã«ãæ»æè ã¯åé¡ãæ±ãå§ããŸãã ãã®ãããããšãã°ãBcryptãæ§æããŠãé«éãŸãã¯äœéã«ããããšãã§ããŸãã é床ãéåžžã«é ããããåªããããŒããŠã§ã¢ã䜿çšããŠã1ç§ããã1,000ããã·ã¥ä»¥äžãèšç®ã§ããªãå ŽåããŠãŒã¶ãŒã«ãšã£ãŠã¯ãããã蚱容ç¯å²å ã§ãããEveã«ãšã£ãŠã¯ãã§ã«å®çšçã§ã¯ãããŸããã ããšãã°ãå°æåã®ã¿ã䜿çšãã8æåã®ãã¹ã¯ãŒãïŒ
26 ^ 8 / 1000 / 3600 / 24 / 365 = 6,6218627782
8æåã®ãã¹ã¯ãŒããè§£èªããå Žåã®3.3幎ïŒå¹³åïŒã ãããããŸã ååãªã»ãã¥ãªãã£ã§ã¯ãããŸããããã»ãã®æ°ç§ãããåªããŠããŸãã
ãã ããèŸæžæ»æããã¯ãŸã ä¿è·ãããŠããªãããšã«æ³šæããŠãã ãã ã ãŠãŒã¶ãŒãäžè¬çãªåèªãéžæããå Žåããã¹ãŠãçµ¶æçã§ãã ããã§ãã劥åœãªæéã§30kããã·ã¥ãèšç®ã§ããŸãã
ãã°ãã«ã€ããŠ
çŸæç¹ã§ã¯ãããã€ãã®è峿·±ãèããæ€èšããŠããŸãã ããšãã°ãäžæ£ãªãã¹ã¯ãŒãã§ãŠãŒã¶ãŒãä¿è·ãããããªããã·ã¥ã¹ããŒã ã¯ãããŸããã ãŠãŒã¶ãŒã«å€§æåãæ°åããã®ä»ã®æåããã¹ã¯ãŒãã«è¿œå ããããšããŠãŒã¶ãŒã«åŒ·å¶ããããšã¯éåžžã«éèŠã§ãïŒã¢ããªã±ãŒã·ã§ã³ã«ãšã£ãŠã»ãã¥ãªãã£ãéèŠãªå ŽåïŒã
ç©äºã®ä»çµã¿ãçè§£ããããšã¯éèŠã§ãã ããã¯ã¹ã ãŒãºã«æ¬¡ã®èãã«ç§ãã¡ãå°ããŸãã ãuse bcryptãã³ãŒã©ã¹ã®åŸãSHA1ã®ç¹°ãè¿ãã«åºã¥ãå¥ã®ãœãªã¥ãŒã·ã§ã³ã䜿çšã§ãããšçããŸããã ããããã©ããããå€ãã®äººã¯ããã°ã©ããŒãæå·ãçè§£ãã¹ãã§ã¯ãªããšèããŠããŸãã 圌ã¯ãããæçŸ©ãšããŠèªèããªããã°ãªããŸããã ããããªããæçŸ©ãæã£ãŠãããªããããªãã¯è²§ããããã°ã©ããŒã«ãªãã§ãããã ã·ã¹ãã ã«bcryptãµããŒãããªãããããã«åãçµãå¿ èŠãããå Žåã¯ã©ãã§ãããã ç°¡åãªã¹ããŒã ãææ¡ããŸããïŒ
SHA1 (SHA1 (SHA1 (...( SHA1 (password | salt))))
ãªããŠç°ç«¯ã ïŒ ãã®ããã«ããã·ã¥é¢æ°ããã§ãŒã³ããããšã¯å®å šã§ã¯ãªãããšãçè§£ããŠããªãã®ã§ãç§ã¯æãè ãšèŠãªãããŸããã ããããå°ãèãããšã©ããªããŸããïŒ
SHA1ã¯ããã·ã¥é¢æ°ã§ãã roundsãšåŒã°ããå°ããªã¹ãããã§æ§æãããäœåºŠãç¹°ãè¿ãå®è¡ãããŸãã ããã¯ãããã¯æå·ã§ã¯ãªããããããŒã®åé¢ã¯ãããŸããããã®é¢æ°ã¯ãå ¥åãããã¹ããªãŒã ãåºå®é·ã®åºåå€ã«åçŽã«å§çž®ããŸãã
å€ãã®æå·ã¢ã«ãŽãªãºã ã¯ãããåçŽãªé¢æ°ã䜿çšããŠæ°åå®è¡ãããã®å¹æãé«ããããšãã§ãããšããèãã«åºã¥ããŠããããšãçè§£ããããšãéèŠã§ãã ãã®æŠå¿µã¯éåžžã«éèŠã§ãããããããã«ã©ãŠã³ãã远å ãããšãã¢ã«ãŽãªãºã ã«å¯Ÿããæ»æãéå®çšçã«ãªãããšããããŸãã æå·åŠè ã¯ãå®å šãªã©ãŠã³ãæ°ã®ãªãã·ã§ã³ãã©ãã ã匷åããããããçè§£ããããã«ãããè匱ãªåœ¢åŒã§ã¢ã«ãŽãªãºã ãåæããããã«ãã©ãŠã³ãæ°ãæžãããã¢ã«ãŽãªãºã ã®ããªã¢ã³ãã䜿çšããå ŽåããããŸãã
ã§ã¯ããªãå€ãã®ã©ãŠã³ãã远å ããªãã®ã§ããïŒ é ãã§ãã ã¢ããã¥ã¢ã®æå·äœæè ã§ãã£ãŠããå®å šã§é ãã¢ã«ãŽãªãºã ãéçºã§ããŸãã åªããæå·äœæè ã¯ãã»ãã¥ãªãã£ãšé床ã®åŠ¥åç¹ãèŠã€ããããšãã§ããŸãã
ããã...ã©ãŠã³ãã®æŠå¿µãããã£ããããSHA1ã«ã¯ããŒåé¢ã¢ã«ãŽãªãºã ããªãã颿°ã®åºåå€ã¯ãã®å ¥åã®ã¿ã«äŸåããSHA1ã¯å転ã®å¯èœæ§ãèæ ®ããŠèšèšãããŠããªãããšãç¥ã£ãŠããŸãïŒããã·ã¥ã«ããå ã®å€ã®ååŸïŒã
ãããã£ãŠãç§ãææ¡ããSHA1ã¹ããŒã ïŒSHA1ïŒSHA1ïŒ..ïŒïŒïŒããŸãã«ãããè¡ããSHA1ã«ã©ãŠã³ãã远å ããããšã¯éåžžã«èªç¶ã§ãã SHA1ã®åºæ¬çãªç¹æ§ãããSHA1ã®ååã«ãã¹ããããåŒã³åºãã«çžåœããç°¡åã«èšç®ã§ãã颿°SHA1000ãèšç®ããããšã¯èšç®äžäžå¯èœã§ããããšãããããŸãã
SHA1ïŒSHA1ïŒ..ïŒïŒã®çµæã¯ã SHA1å ã«ããã«ã©ãŠã³ãã远å ããããšãšåãã§ã¯ãªãããšã«æ³šæããŠãã ãããååŠçãšåŸåŠçããããŸãã
ãããŠãããªãã¯äœãç¥ã£ãŠããŸããïŒ ä»æãRFC2898ã«èšè¿°ãããŠããPBKDF1ã¢ã«ãŽãªãºã ããŸãã«ç§ãææ¡ããããšãè¡ãããšãçºèŠããŸããã
ããªãã«éãèŠããŠãããããšãéåžžã«åãã§ãã人ãããŸããã圌ããããèŠããšã圌ããäœã«ã€ããŠè©±ããŠããã®ãåãããªãããšãããããŸãã å®çžŸã®ããæšæºã䜿çšããå®å šãªã³ãŒããæžããŠã¿ãŠãã ããããŸããå¿ã䜿ã£ãŠãæå·åãšããªããã£ãã®çµåæ¹æ³ã«ã€ããŠåŠç¿ããŠãã ããã ãã°ã-ããã¯åžãã
ããã°ã©ããŒãèªåã®ãããã¯æå·ãçºæããããã䟿å©ãªç®çã®ããã«ã©ããã§äœ¿çšããããšããã®ã¯è¯ãèãã§ã¯ãªããããããŸããã ãã®ããã«ç¹å¥ã«èšç·Žããã人ã ãããŸãã æå·åã䜿çšããŠå®è¡ã§ããåã ã®ãããªãã¯ãããããã³ã«ãæ£ãã䜿çšããæ¹æ³ãªã©ãçè§£ããããšã¯ã¯ããã«éèŠã§ãã
çµè«ãšããŠã人ã ãç§ã«ç¡ç€Œã§ãããšããåæã«åœŒããæ£ãããªããç§ã¯å·éã§ãããšèšãããã§ãã Aræ ¢ã¯ããããå¿ã«åã£ãŠããã°ãããã»ã©å€§ããªåé¡ã§ã¯ãããŸããã insteadæ ¢ãç¡ç¥ãšåºäŒããªããããã¯å®ã«æ²ãã話ã§ãã