ã泚æ perevãïŒããã§ããå®å šãªå³ãèŠãã«ã¯ãèè ãèšäºã§èšåããŠããPHP 5.5 Password Hashing APIã䜿çšããããã·ã¥ãã¹ã¯ãŒãã®ç¿»èš³ãåŸ ã£ãŠããŸãã
ããã·ã¥ã¢ã«ãŽãªãºã ãç 究ããŠããªãå Žåã¯ãããããã å¯å€é·ããŒã¿ãåºå®é·ããŒã¿ã«å€æããäžæ¹åé¢æ°ãšããŠèªèããŸã ã ãã®å®çŸ©ãåæããŠã¿ãŸãããã
- äžæ¹åé¢æ° ïŒå¹ççãªã¢ã«ãŽãªãºã ã䜿çšããŠããã·ã¥ããå ã®ããŒã¿ã埩å ããããšã¯äžå¯èœã§ãã
- å¯å€é·ããŒã¿ãåºå®é·ããŒã¿ã«å€æããŸã ãå ¥åå€ã¯ãç¡éãé·ã«ããããšãã§ããŸãããåºåå€ã¯ã§ããŸããã ããã¯ã2ã€ä»¥äžã®å ¥åå€ãåãããã·ã¥ãæã€ããšãã§ããããšãæå³ããŸãã ããã·ã¥ã®é·ããçãã»ã©ãè¡çªã®å¯èœæ§ãé«ããªããŸãã
ã¢ã«ãŽãªãºã MD5ããã³SHA-1ã¯ãè¡çªã®å¯èœæ§ã«é¢ããŠååã«é«ãä¿¡é Œæ§ãæäŸããªããªããŸããïŒ èªçæ¥ã®ãã©ããã¯ã¹ãåç §ïŒã ãããã£ãŠãããé·ãããã·ã¥ïŒ SHA-256ãSHA-512 ã ã¯ãŒã«ããŒã«ãªã©ïŒãçæããã¢ã«ãŽãªãºã ã䜿çšããããšããå§ãããŸããããã«ãããè¡çªã®å¯èœæ§ã¯ç¡èŠã§ããŸãã ãã®ãããªã¢ã«ãŽãªãºã ã¯ã ç䌌ã©ã³ãã é¢æ°ããšãåŒã°ããŸããã€ãŸãããããã®äœæ¥ã®çµæã¯ãå®å šä¹±æ°ãžã§ãã¬ãŒã¿ãŒ ïŒTRNGïŒã®æäœã®çµæãšåºå¥ã§ããŸããã
ã·ã³ãã«ããã·ã¥ã®ãã¡ãªãã
å¹æçãªã¢ã«ãŽãªãºã ã®å©ããåããŠãããã·ã¥ãšéã®æäœãå®è¡ããŠå ã®ããŒã¿ã埩å ããããšã¯äžå¯èœã§ãããšããäºå®ã¯ããããã³ã°ã§ããªããšããæå³ã§ã¯ãããŸããã ããŸãæ€çŽ¢ããã°ãäžè¬çãªåèªãšçããã¬ãŒãºã®ããã·ã¥ãæã€ããŒã¿ããŒã¹ãèŠã€ããããšãã§ããŸãã ããã«ãåçŽãªãã¹ã¯ãŒãã¯ãèŸæžæ€çŽ¢ã«ãã ãã«ãŒããã©ãŒã¹ãŸãã¯ãã¬ã€ã¯ãã©ãŒã¹ã«ç°¡åã«è§£èªã§ããŸãã
以äžã«ã SQLã€ã³ãžã§ã¯ã·ã§ã³ãéããŠsqlmapããŒã«ãMD5ã¢ã«ãŽãªãºã ã«ãã£ãŠçæããããã«ãŒããã©ãŒã¹ããã·ã¥ã䜿çšããŠãã¹ã¯ãŒããç Žãæ¹æ³ã®ç°¡åãªãã¢ã瀺ããŸãã
æ»æè ã¯ããã«ç°¡åã«å®è¡ã§ããŸã-ãªã³ã©ã€ã³ããŒã¿ããŒã¹ã®Googleåºæã®ããã·ã¥ïŒ
ãŸãã2ã€ä»¥äžã®åäžã®ãã¹ã¯ãŒããåãããã·ã¥ãæã£ãŠããå Žåã1ã€ã®ããã·ã¥ãå£ãããšã«ãããåããã¹ã¯ãŒãã䜿çšãããã¹ãŠã®ã¢ã«ãŠã³ãã«ã¢ã¯ã»ã¹ã§ããããšãç解ããå¿ èŠããããŸãã äŸïŒæ°å人ã®ãŠãŒã¶ãŒãããŠããã®ãã¡ã®ããã€ãããã¹ã¯ãŒã123456ã䜿çšããŠãããšä»®å®ããŸãïŒãµã€ãã®èšå®ã«ãããã¹ã¯ãŒããè€éã«ãªããªãå ŽåïŒã ãã®ãã¹ã¯ãŒãã®MD5ããã·ã¥ã¯e10adc3949ba59abbe56e057f20f883eã§ãã ãããã£ãŠããã®ããã·ã¥ãååŸããŠããŒã¿ããŒã¹ã§ãã®å€ã調ã¹ããšããã®ãã¹ã¯ãŒããæã€ãã¹ãŠã®ãŠãŒã¶ãŒãèŠã€ãããŸãã
ãœã«ãããã·ã¥ãå®å šã§ãªãçç±
ãã®ã¿ã€ãã®æ»æãè€éã«ããããã«ããããããœã«ãã䜿çšãããŸãã ããã¯æšæºçãªããŒã«ã§ãããçŸä»£ã®ã³ã³ãã¥ãŒãã£ã³ã°èœåã®æ¡ä»¶ã§ã¯ãç¹ã«å¡©ãå°ãªãå Žåã¯ãã¯ãååã§ã¯ãããŸããã
äžè¬ã«ãsaltã䜿çšããé¢æ°ã¯æ¬¡ã®ããã«è¡šãããšãã§ããŸãã
fïŒãã¹ã¯ãŒãããœã«ãïŒ=ããã·ã¥ïŒãã¹ã¯ãŒã+ãœã«ãïŒ
ãã«ãŒããã©ãŒã¹æ»æãããå°é£ã«ããããã«ããœã«ãã¯å°ãªããšã64æåã®é·ããå¿ èŠã§ãã ããããåé¡ã¯ããŠãŒã¶ãŒèªèšŒãããã«é²ããããã«ããœã«ãããã¬ãŒã³ããã¹ãã§ããŒã¿ããŒã¹ã«ä¿åããå¿ èŠãããããšã§ãã
ifïŒhashïŒ[å ¥åããããã¹ã¯ãŒã] + [salt]ïŒ== [hash]ïŒãŠãŒã¶ãŒã¯èªèšŒãããŸã
åãŠãŒã¶ãŒã®ãœã«ãã®äžææ§ã«ãããåçŽãªããã·ã¥ã®è¡çªã®åé¡ã解決ã§ããŸãã ããã§ããã¹ãŠã®ããã·ã¥ãç°ãªããŸãã ãŸããGoogleããã·ã¥ãšãã«ãŒããã©ãŒã¹ã䜿çšããã¢ãããŒãã¯æ©èœããŸããã ããããæ»æè ãSQLã³ãŒãã€ã³ãžã§ã¯ã·ã§ã³ãä»ããŠãœã«ããŸãã¯ããŒã¿ããŒã¹ã«ã¢ã¯ã»ã¹ãããšãç¹ã«ãŠãŒã¶ãŒãäžè¬çãªãã¹ã¯ãŒãïŒla 123456ïŒãéžæããå Žåããã«ãŒããã©ãŒã¹ãŸãã¯èŸæžæ€çŽ¢ã䜿çšããŠæ»æãæåãããããšãã§ããŸãã
ããã§ãããã¹ãŠã®ããã·ã¥ãç°ãªãããããã¹ã¯ãŒãããããã³ã°ããŠãåããã¹ã¯ãŒããæã€ãŠãŒã¶ãŒãèªåçã«èšç®ãããããšã¯ãªããªããŸãã
ãã£ã³ã¹ã®ç¬é
é©åãªãœã«ããçæããã«ã¯ãé©åãªä¹±æ°ãžã§ãã¬ãŒã¿ãŒãå¿ èŠã§ãã randïŒïŒé¢æ°ãå¿ããŠãã ããã
ãã®åé¡ã«é¢ããçŽ æŽãããèšäºããããŸãã ã€ãŸããã³ã³ãã¥ãŒã¿ãŒèªäœã¯ã©ã³ãã ããŒã¿ãçæããã 決å®è«çãªãã·ã³ã§ãã ã€ãŸããå ¥åã§åãããŒã¿ãæ°ååãåã£ãåå®è¡ã¢ã«ãŽãªãºã ã¯ãåºåã§åãçµæã瀺ããŸãã
ã³ã³ãã¥ãŒã¿ããä¹±æ°ãå¿ èŠãªå Žåãéåžžãããã€ãã®ãœãŒã¹ïŒããšãã°ãç°å¢å€æ°ïŒæ¥ä»ãæå»ãæžã蟌ã¿/èªã¿åããã€ãæ°ãªã©ïŒããããŒã¿ãååŸãããããã«å¯ŸããŠèšç®ãå®è¡ããŠãã©ã³ãã ãããŒã¿ãååŸããŸãã ãããã£ãŠããã®ãããªããŒã¿ã¯æ¬äŒŒã©ã³ãã ãšåŒã°ããŸãã ãããã£ãŠãç䌌乱æ°é¢æ°ã®å®è¡æã«äœããã®æ¹æ³ã§åæç¶æ ã®ã»ãããåäœæãããšãåãæ°ãçæã§ããŸãã
ç䌌乱æ°ãžã§ãã¬ãŒã¿ãŒãæ£ããå®è£ ãããŠããªãå ŽåãçæãããããŒã¿ã§ãã¿ãŒã³ãæ€åºã§ãããã®å©ããåããŠçæçµæãäºæž¬ã§ããŸãã PHPé¢æ°randïŒïŒã®çµæã§ãããã®å³ãèŠãŠãã ããã
次ã«ãæ¬æ Œçãªä¹±æ°ãžã§ãã¬ãŒã¿ãŒã«ãã£ãŠçæãããããŒã¿ãšæ¯èŒããŸãã
æ®å¿µãªãããrandïŒïŒãmt_randïŒïŒããé«ã¬ãã«ã®ã»ãã¥ãªãã£ã確ä¿ããããã®é©åãªããŒã«ãšã¯èŠãªãããŸããã
ã©ã³ãã ããŒã¿ãååŸããå¿ èŠãããå Žåã¯ãããŒãžã§ã³5.3.0以éã§äœ¿çšå¯èœãªopenssl_random_pseudo_bytesïŒïŒé¢æ°ã䜿çšããŸãã 圌女ã¯ãååãªã¬ãã«ã®ã»ãã¥ãªãã£ã瀺ãcrypto_strongãã©ã°ããæã£ãŠããŸãã
䜿çšäŸïŒ
<?php function getRandomBytes ($byteLength) { /* * openssl_random_pseudo_bytes */ if (function_exists('openssl_random_pseudo_bytes')) { $randomBytes = openssl_random_pseudo_bytes($byteLength, $cryptoStrong); if ($cryptoStrong) return $randomBytes; } /* * openssl_random_pseudo_bytes * , */ $hash = ''; $randomBytes = ''; /* * Linux/UNIX- /dev/urandom , * $hash */ if (file_exists('/dev/urandom')) { $fp = fopen('/dev/urandom', 'rb'); if ($fp) { if (function_exists('stream_set_read_buffer')) { stream_set_read_buffer($fp, 0); } $hash = fread($fp, $byteLength); fclose($fp); } } /* * mt_rand(), rand()! */ for ($i = 0; $i < $byteLength; $i ++) { $hash = hash('sha256', $hash . mt_rand()); $char = mt_rand(0, 62); $randomBytes .= chr(hexdec($hash[$char] . $hash[$char + 1])); } return $randomBytes; }
ãã¹ã¯ãŒãæ¡åŒµå
ãã¹ã¯ãŒãã¹ãã¬ãããå®è£ ã§ããŸããããã«ããããã«ãŒããã©ãŒã¹æ»æãããã«å°é£ã«ãªããŸãã ã¹ãã¬ããã³ã°ã¯ãæ°äžåïŒãŸãã¯ãã以äžïŒèªèº«ã®ããã·ã¥ãäœåºŠãèšç®ããå埩ã¢ã«ãŽãªãºã ãŸãã¯ååž°ã¢ã«ãŽãªãºã ã§ãã
å埩ã®æ°ã¯ãåèšèšç®æéãå°ãªããšã1ç§ãããããã«ããå¿ èŠããããŸãã ããã·ã¥ãé·ããªãã»ã©ãæ»æè ããããã³ã°ã«è²»ããæéãé·ããªããŸãã
ã¹ãã¬ããã§ãã¹ã¯ãŒããã¯ã©ãã¯ããã«ã¯ã次ã®ãã®ãå¿ èŠã§ãã
- åå·®ããããšç°ãªãããã·ã¥ã«ãªããããå埩ã®æ£ç¢ºãªæ°ãç¥ã£ãŠãã ããã
- åè©Šè¡ã®éã«å°ãªããšã1ç§åŸ ã¡ãŸãã
ããã«ãããæ»æã®å¯èœæ§ã¯éåžžã«äœããªããŸãããäžå¯èœã§ã¯ãããŸããã 2çªç®ã®é 延ãå æããã«ã¯ãæ»æè ã¯ããã·ã¥ã¢ã«ãŽãªãºã ãæ§æãããã³ã³ãã¥ãŒã¿ãŒãããå¹ççãªã³ã³ãã¥ãŒã¿ãŒã䜿çšããå¿ èŠããããŸãã ãã®çµæããããã³ã°ããã»ã¹ã«ã¯è¿œå ã³ã¹ããå¿ èŠã«ãªãå ŽåããããŸãã
ãã¹ã¯ãŒããæ¡åŒµããã«ã¯ã ããŒçæé¢æ°ã§ããPBDKDF2ãªã©ã®æšæºã¢ã«ãŽãªãºã ã䜿çšã§ããŸãã
<?php /* * , * CPU/GPU. * ( ). * , ! : - * http://ru.wikipedia.org/wiki/PBKDF2 - http://www.ietf.org/rfc/rfc2898.txt */ function pbkdf2 ($password, $salt, $rounds = 15000, $keyLength = 32, $hashAlgorithm = 'sha256', $start = 0) { // Key blocks to compute $keyBlocks = $start + $keyLength; // Derived key $derivedKey = ''; // Create key for ($block = 1; $block <= $keyBlocks; $block ++) { // Initial hash for this block $iteratedBlock = $hash = hash_hmac($hashAlgorithm, $salt . pack('N', $block), $password, true); // Perform block iterations for ($i = 1; $i < $rounds; $i ++) { // XOR each iteration $iteratedBlock ^= ($hash = hash_hmac($hashAlgorithm, $hash, $password, true)); } // Append iterated block $derivedKey .= $iteratedBlock; } // Return derived key of correct length return base64_encode(substr($derivedKey, $start, $keyLength)); }
ãŸããbcryptïŒä»¥äžã§èª¬æããŸãïŒãscryptãªã©ãããæéãšã¡ã¢ãªãæ¶è²»ããã¢ã«ãŽãªãºã ããããŸãã
<?php // bcrypt crypt() $hash = crypt($pasword, '$2a$' . $cost . '$' . $salt);
- $ã³ã¹ã-åŽåæå ¥ç;
- $ saltã¯ã©ã³ãã ãªæååã§ãã ããšãã°ãäžèšã®secure_randïŒïŒé¢æ°ã䜿çšããŠçæã§ããŸãã
åŽåçã¯ãããã·ã¥ãå®è¡ããããã·ã³ã«å®å šã«äŸåããŸãã 09ã®å€ããéå§ããæäœã®æéã1ç§ã«éãããŸã§åŸã ã«å¢ããããšãã§ããŸãã ããŒãžã§ã³5.5以éã§ã¯ãpassword_hashïŒïŒé¢æ°ã䜿çšã§ããŸããããã«ã€ããŠã¯åŸã§èª¬æããŸãã
PHPã¯çŸåšscryptããµããŒãããŠããŸããããDomblackã®å®è£ ã䜿çšã§ããŸãã
æå·åæè¡ã®äœ¿çš
å€ãã¯ãããã·ã¥ãšæå·åã®ç¹ã§æ··ä¹±ããŠããŸãã äžèšã®ããã«ãããã·ã¥ã¯æ¬äŒŒä¹±æ°é¢æ°ã®çµæã§ãããæå·åã¯æ¬äŒŒä¹±æ°å€æã®å®è£ ã§ãïŒå ¥åããŒã¿ã¯éšåã«åå²ãããçµæãæ¬æ Œçãªä¹±æ°ãžã§ãã¬ãŒã¿ãŒã®äœæ¥ãšèŠåããã€ããªããªããããªæ¹æ³ã§åŠçãããŸãã ãã ãããã®å Žåãéå€æãå®è¡ããŠå ã®ããŒã¿ã埩å ã§ããŸãã å€æã¯æå·ããŒã䜿çšããŠå®è¡ãããŸããããã䜿çšããªããšãéå€æãå®è¡ã§ããŸããã
æå·åãšããã·ã¥ã«ã¯å¥ã®éèŠãªéãããããŸããåºåã¡ãã»ãŒãžã®ã¹ããŒã¹ã®ãµã€ãºã¯ç¡å¶éã§ãããå ¥åããŒã¿ã®ãµã€ãºã«1ïŒ1ã®æ¯çã§äŸåããŸãã ãããã£ãŠãè¡çªã®ãªã¹ã¯ã¯ãããŸããã
æå·åãæ£ãã䜿çšããã«ã¯çŽ°å¿ã®æ³šæãå¿ èŠã§ãã éèŠãªããŒã¿ãä¿è·ããã«ã¯ãåã«äœããã®ã¢ã«ãŽãªãºã ã䜿çšããŠæå·åããã ãã§ååã ãšã¯æããªãã§ãã ããã ããŒã¿ãçãæ¹æ³ã¯ãããããããŸãã äž»ãªã«ãŒã«-ã¢ããã¥ã¢ã®ããã©ãŒãã³ã¹ã«ã¯æ±ºããŠé¢äžãããæ¢æã®ååã«éçºãããå®è£ ã䜿çšããŸãã
ãã°ããåã«ãAdobeã¯æå·åãäžé©åã«å®è£ ãããŠããããã匷åãªãŠãŒã¶ãŒããŒã¿ããŒã¹ãªãŒã¯ãçºçããŸããã 圌ãã«äœãèµ·ãã£ãã®ãèŠãŠã¿ãŸãããã
次ã®ããŒã¿ããã¬ãŒã³ããã¹ãã§ããŒãã«ã«æ ŒçŽãããŠãããšä»®å®ããŸãã
Adobeã®èª°ãããã¹ã¯ãŒããæå·åããããšã決ããŸãããã2ã€ã®å€§ããªééããç¯ããŸããã
- åãæå·ããŒã䜿çšããŸããã
- passwordHintãã£ãŒã«ãã¯æå·åãããŸããã
æå·ååŸãããŒãã«ã次ã®ããã«ãªãå§ãããšããŸãã
ã©ã®æå·é貚ã䜿çšããããã¯ããããŸããã ãã ããããŒã¿ãåæãããšã2è¡ç®ãš7è¡ç®ã3è¡ç®ãš6è¡ç®ã§åããã¹ã¯ãŒãã䜿çšãããŠããããšã«æ°ä»ãã§ãããã
ããã§ã¯ããã¹ã¯ãŒãã®ãã³ããèŠãŠã¿ãŸãããã 6è¡ç®ã¯ãI'm oneïŒãã§ããããã¯ãŸã£ããæ å ±ããããŸããã ãããã3è¡ç®ã®ãããã§ããã¹ã¯ãŒããqueenã§ãããšæ³å®ã§ããŸãã 2è¡ç®ãš7è¡ç®ã§ã¯ããã¹ã¯ãŒããåå¥ã«èšç®ããããšã¯ã§ããŸããããããããäžç·ã«åæãããšãããã¯ãããŠã£ãŒã³ã§ãããšæ³å®ã§ããŸãã
ããŒã¿æŒããã®ãªã¹ã¯ãæžããã«ã¯ãç°ãªãããã·ã¥æ¹æ³ã䜿çšããããšããå§ãããŸãã ãã¹ã¯ãŒããæå·åããå¿ èŠãããå Žåã¯ãã«ã¹ã¿ã æå·åã«æ³šæããŠãã ããã
äœå人ãã®ãŠãŒã¶ãŒãããŠããã¹ãŠã®ãã¹ã¯ãŒããæå·åãããšããŸãã äžèšã®ããã«ãåäžã®æå·ããŒã䜿çšããããšã¯é¿ããã»ããè¯ãã§ãããã ããããããŒãä¿åããããšèªäœãåé¡ã«ãªããããåãŠãŒã¶ãŒã«äžæã®ããŒãäœæããããšãã§ããŸããã ãã®å Žåããã¹ãŠã«å ±éã®æå·é貚ãé©çšããã ãã§ååã§ãããåæã«åãŠãŒã¶ãŒã«åºæã®ãèšå®ããäœæããŸãã ããŒãšãèšå®ãã®çµã¿åããã¯ããŠãŒã¶ãŒããšã«äžæã®ããŒã«ãªããŸãã
æãåçŽãªãã»ããã¢ããããªãã·ã§ã³ã¯ãããŒãã«å ã®åãšã³ããªã«åºæã®ããããããã©ã€ããªããŒã§ãã 人çã§äœ¿çšããããšã¯ãå§ãããŸãããããã§ã¯äŸãšããŠã®ã¿ç€ºããŸãã
fïŒããŒãprimaryKeyïŒ=ããŒ+ primaryKey
ããã§ã¯ãããŒãšäž»ããŒã¯åçŽã«é£åããŠããŸãã ãã ããã»ãã¥ãªãã£ã確ä¿ããã«ã¯ãããã·ã¥ã¢ã«ãŽãªãºã ãŸãã¯ããŒæŽŸçé¢æ°ãé©çšããå¿ èŠããããŸãã ãŸããäž»ããŒã®ä»£ããã«ãåã¬ã³ãŒãã«ã¯ã³ã¿ã€ã ã㌠ïŒãœã«ãã®ã¢ããã°ïŒã䜿çšã§ããŸãã
ããŒãã«ã«ã«ã¹ã¿ã æå·åãé©çšãããšã次ã®ããã«ãªããŸãã
ãã¡ããããã¹ã¯ãŒãã®ãã³ãã䜿çšããŠå¥ã®æäœãè¡ãå¿ èŠããããŸãããããã§ãååãªãã®ããã§ã«å€æããŠããŸãã
æå·åã¯ãã¹ã¯ãŒããä¿åããããã®çæ³çãªãœãªã¥ãŒã·ã§ã³ã§ã¯ãªãããšã«æ³šæããŠãã ããã ã³ãŒãã€ã³ãžã§ã¯ã·ã§ã³ã®è åšã®ããããã®ä¿è·æ¹æ³ã¯é¿ããã®ãæåã§ãã ãã¹ã¯ãŒããä¿åããæãä¿¡é Œã§ããæ¹æ³ã¯ãbcryptã¢ã«ãŽãªãºã ã䜿çšããããšã§ãã ããããæè¯ãã€æãå®çžŸã®ãããœãªã¥ãŒã·ã§ã³ã§ãã£ãŠãè匱æ§ãããããšãå¿ããŠã¯ãªããŸããã
PHP 5.5
çŸåšãbcryptã䜿çšããããšãããã¹ã¯ãŒããããã·ã¥ããããã®æè¯ã®æ¹æ³ãšèŠãªãããŠããŸãã ããããå€ãã®éçºè ã¯ãMD5ãSHA-1ã®ãããªå€ããŠåŒ±ãã¢ã«ãŽãªãºã ãäŸç¶ãšããŠå¥œãã§ããŸãã ãŸããããã·ã¥ãããšãã«ãœã«ããã䜿çšããªã人ãããŸãã PHP 5.5ã¯æ°ããããã·ã¥APIãå°å ¥ããŸãããããã¯ãbcryptã®äœ¿çšãä¿é²ããã ãã§ãªããäœæ¥ãã¯ããã«å®¹æã«ããŸãã ãã®æ°ããAPIã®äœ¿çšã®åºæ¬ãèŠãŠã¿ãŸãããã
ããã«ã¯4ã€ã®åçŽãªé¢æ°ãé©çšãããŸãã
- password_hashïŒïŒ-ãã¹ã¯ãŒãããã·ã¥;
- password_verifyïŒïŒ-ãã¹ã¯ãŒããšããã·ã¥ã®æ¯èŒã
- password_needs_rehashïŒïŒ-ãã¹ã¯ãŒãã®åããã·ã¥ã
- password_get_infoïŒïŒ-ããã·ã¥ã¢ã«ãŽãªãºã ã®ååãšããã·ã¥æã«äœ¿çšããããªãã·ã§ã³ãè¿ããŸãã
password_hashïŒïŒ
cryptïŒïŒé¢æ°ã«ãã£ãŠæäŸãããé«åºŠãªã»ãã¥ãªãã£ã«ãããããããå€ãã®äººã¯ãããè€éããããšèããŠããããããããã°ã©ãããã°ãã°ééããç¯ãçç±ã§ãã 代ããã«ãäžéšã®éçºè ã¯ã匱ãã¢ã«ãŽãªãºã ãšåŒ±ããœã«ãã®çµã¿åããã䜿çšããŠããã·ã¥ãçæããŸãã
<?php $hash = md5($password . $salt); // ,
password_hashïŒïŒé¢æ°ã¯ãéçºè ã®äœæ¥ã楜ã«ããã³ãŒãã®ã»ãã¥ãªãã£ãæ¹åããŸãã ãã¹ã¯ãŒããããã·ã¥ããã«ã¯ããã®æ©èœããã£ãŒãããã ãã§ååã§ãããããŒã¿ããŒã¹ã«é 眮ã§ããããã·ã¥ãè¿ããŸãã
<?php $hash = password_hash($passwod, PASSWORD_DEFAULT);
ããã ãã§ãïŒ æåã®åŒæ°ã¯æååãšããŠã®ãã¹ã¯ãŒãã§ããã2çªç®ã®åŒæ°ã¯ããã·ã¥çæã¢ã«ãŽãªãºã ãèšå®ããŸãã ããã©ã«ãã§ã¯bcryptã䜿çšãããŸãããå¿ èŠã«å¿ããŠãããé·ãæååãçæã§ãã匷åãªã¢ã«ãŽãªãºã ãè¿œå ã§ããŸãã ãããžã§ã¯ãã§PASSWORD_DEFAULTã䜿çšããå Žåãããã·ã¥ãä¿åããããã®åå¹ ãå°ãªããšã60æåã§ããããšã確èªããŠãã ããã ããã«255æåãèšå®ããããšããå§ãããŸãã PASSWORD_BCRYPTã2çªç®ã®åŒæ°ãšããŠäœ¿çšã§ããŸãã ãã®å Žåãããã·ã¥ã®é·ãã¯åžžã«60æåã§ãã
ãœã«ãå€ãã³ã¹ããã©ã¡ãŒã¿ãŒãèšå®ããå¿ èŠã¯ãªãããšã«æ³šæããŠãã ããã æ°ããAPIããã¹ãŠãè¡ããŸãã ãœã«ãã¯ããã·ã¥ã®äžéšã§ãããããåå¥ã«ä¿åããå¿ èŠã¯ãããŸããã ããã§ãç¬èªã®ãœã«ãïŒãŸãã¯å€ïŒå€ãèšå®ããå¿ èŠãããå Žåã¯ã3çªç®ã®åŒæ°ã䜿çšããŠãããå®è¡ã§ããŸãã
<?php $options = [ 'salt' => custom_function_for_salt(), // 'cost' => 12 // 10 ]; $hash = password_hash($password, PASSWORD_DEFAULT, $options);
ããã«ãããææ°ã®ã»ãã¥ãªãã£æ©èœã䜿çšã§ããŸãã å°æ¥ããã匷åãªããã·ã¥ã¢ã«ãŽãªãºã ãPHPã«ç»å Žããå Žåãã³ãŒãã¯ãããèªåçã«äœ¿çšããŸãã
password_verifyïŒïŒ
次ã«ããã¹ã¯ãŒããšããã·ã¥ãæ¯èŒããæ©èœãæ€èšããŸãã æåã¯ãŠãŒã¶ãŒãå ¥åãã2çªç®ã¯ããŒã¿ããŒã¹ããååŸããŸãã ãã¹ã¯ãŒããšããã·ã¥ã¯ãpassword_verifyïŒïŒã®2ã€ã®åŒæ°ãšããŠäœ¿çšãããŸãã ããã·ã¥ããã¹ã¯ãŒããšäžèŽããå Žåãé¢æ°ã¯trueãè¿ããŸãã
<?php if (password_verify($password, $hash)) { // ! } else { // }
saltã¯ããã·ã¥ã®äžéšã§ãããããããã§ã¯åå¥ã«èšå®ãããªãããšã«æ³šæããŠãã ããã
password_needs_rehashïŒïŒ
ãã匷åãªãœã«ããè¿œå ããããã³ã¹ããã©ã¡ãŒã¿ãå¢ãããŠã»ãã¥ãªãã£ã®ã¬ãã«ãäžãããå ŽåããŸãã¯ããã©ã«ãã®ããã·ã¥ã¢ã«ãŽãªãºã ãå€æŽãããå Žåã¯ã䜿çšå¯èœãªãã¹ãŠã®ãã¹ã¯ãŒããããã·ã¥ããå¿ èŠããããŸãã ãã®é¢æ°ã¯ãåããã·ã¥ãäœæãããšãã«äœ¿çšãããã¢ã«ãŽãªãºã ãšãã©ã¡ãŒã¿ãŒã確èªããã®ã«åœ¹ç«ã¡ãŸãã
<?php if (password_needs_rehash($hash, PASSWORD_DEFAULT, ['cost' => 12])) { // , // 12 $hash = password_hash($password, PASSWORD_DEFAULT, ['cost' => 12]); // ! }
ãã¬ãŒã³ããã¹ãã§ãã¹ã¯ãŒãã«ã¢ã¯ã»ã¹ã§ããã®ã¯ãããå¯äžã®æéã§ããããããŠãŒã¶ãŒããã°ã€ã³ããããšãããšãã«ãããè¡ãå¿ èŠãããããšãå¿ããªãã§ãã ããã
password_get_infoïŒïŒ
ãã®é¢æ°ã¯ããã·ã¥ãåãåãã3ã€ã®èŠçŽ ã®é£æ³é åãè¿ããŸãã
- algo-ã¢ã«ãŽãªãºã ãèå¥ã§ããå®æ°ã
- algoName-䜿çšãããã¢ã«ãŽãªãºã ã®ååã
- options-ããã·ã¥äžã«äœ¿çšãããããŸããŸãªãªãã·ã§ã³ã®å€ã
PHPã®ä»¥åã®ããŒãžã§ã³
ã芧ã®ãšãããæ°ããAPIã䜿çšããäœæ¥ã¯ãåä»ãªcryptïŒïŒé¢æ°ã䜿çšããå Žåãããç°¡åãªäŸã§ã¯ãããŸããã PHPã®ä»¥åã®ããŒãžã§ã³ã䜿çšããå Žåã¯ã password_compactã©ã€ãã©ãªã«æ³šæããããšããå§ãããŸã ã ãã®APIããšãã¥ã¬ãŒãããããŒãžã§ã³5.5ã«ã¢ããã°ã¬ãŒããããšèªåçã«ç¡å¹ã«ãªããŸãã
ãããã«
æ®å¿µãªãããããŒã¿ä¿è·ã®ããã®çæ³çãªãœãªã¥ãŒã·ã§ã³ã¯ãŸã ãããŸããã ããã«ãã»ãã¥ãªãã£ã·ã¹ãã ã«äŸµå ¥ãããªã¹ã¯ãåžžã«ãããŸãã ããããã·ã§ã«ãšã¢ãŒããŒãšã®éã®éäºã¯æ¢ãŸããŸããã ããšãã°ãç§ãã¡ã®ä¿è·å ·ã¯æè¿ãããããã¹ãã³ãžæ©èœã§è£å ãããŠããŸã ã