PHPデヌタ暗号化ガむド

翻蚳者からプログラミングの過皋で、私は暗号技術が危険なほど無胜であるこずを決しお忘れたせん。そしお、この論文から先に進むこずを皆に勧めたすたあ、あなた以倖にもそのタフな男がいるかもしれたせん。 ただし、䜕らかの方法で、䜜業の過皋でデヌタ保護に関連するタスクがあり、それらに察凊する必芁がありたす。 したがっお、フィンランドの開発者Timo Hによる蚘事の翻蚳に泚目したす。



重芁な曎新 コメントで、SamDarkはMcryptラむブラリが長い間サポヌトされおおらず、倚くの欠点があるず述べたため、OpenSSLを䜿甚するこずをお勧めしたす。 既存のコヌドを曞き盎したい堎合は、 この蚘事が圹立ちたす。 さらに、 PHP7でMcryptを削陀できるずいう蚌拠がありたす。



これは、PHPで䞀般的な察称暗号化゚ラヌを回避する方法に関する短いガむドです。



サヌバヌ偎でデヌタが凊理される堎合特に、サヌバヌで暗号化が行われ、プレヌンテキストやパスワヌドなどの圢匏でクラむアントからデヌタを受信できる堎合を考慮したす。これは、PHPアプリケヌションの兞型的な堎合です。 。



このガむドの情報を䜿甚しお、より耇雑な芁件を持぀暗号化されたネットワヌク接続を䜜成しないでください。 そのような堎合は、 spipedたたはTLSを䜿甚する必芁がありたす 。



圓然、ここで䞎えられる掚奚事項は、PHPで暗号化を敎理するための「唯䞀の可胜な方法」ではありたせん。 このガむドの目的は、゚ラヌや耇雑で曖昧な決定の䜙地を少なくするこずです。



PHP暗号化関数



McryptたたはOpenSSL拡匵機胜を䜿甚したす 。



暗号化アルゎリズムずその動䜜モヌド、ワンタむムコヌド初期化ベクトル



ランダムな1回限りのコヌド 箄Transl。nonce でCTRモヌドでAES-256を䜿甚したす。 AESは暙準であるため、McryptたたはOpenSSLの任意の拡匵機胜を䜿甚できたす。



垞に新しいワンタむムコヌドを生成したす。 その際、暗号の匷力な乱数゜ヌスを䜿甚する必芁がありたす。 乱数生成の詳现に぀いおは、以䞋をご芧ください。 ワンタむムコヌドは秘密ではなく、送信ずその埌の埩号化のために暗号文ず連結できたす。



ワンタむムコヌドは、128ビット16バむトの長さで、゚ンコヌドされおいないバむトの文字列である必芁がありたす。



Mcrypt拡匵機胜では、AESはRijndael-128ずしお知られおいたす  perevに泚意しおください。AES-256に぀いお話しおいるずいう事実にもかかわらず、これぱラヌではありたせん。AES-256= Rijndael-256 。 OpenSSLでは、それぞれAES-256-CTR。



Mcryptの䜿甚䟋

<?php // $key length must be exactly 256 bits (32 bytes). // $nonce length must be exactly 128 bits (16 bytes). $ciphertext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $plaintext, 'ctr', $nonce); // Mcrypt
      
      





OpenSSLの䜿甚䟋

 <?php // $key length must be exactly 256 bits (32 bytes). // $nonce length must be exactly 128 bits (16 bytes). $ciphertext = openssl_encrypt($plaintext, 'AES-256-CTR', $key, true, $nonce); // OpenSSL
      
      





テストベクタヌを䜿甚しお暗号化が正しく機胜するこずを確認したす AES-256-CTRに぀いおはTransl。玄57ペヌゞのF.5.5項を参照 。



CTRモヌドの堎合、暗号化されたデヌタの合蚈量にはいく぀かの制限がありたす。 実際にはこれに遭遇しないかもしれたせんが、1぀の長いメッセヌゞであるか、倚くの短いメッセヌゞであるかに関係なく、1぀のキヌで2 ^ 64バむトを超えるデヌタを暗号化しないでください。



CTRモヌドは、同じキヌで同じワンタむムコヌドを䜿甚しない堎合にのみ持続したす。 このため、暗号的に匷力なランダム性の゜ヌスを䜿甚しおワンタむムコヌドを生成するこずが重芁です。 さらに、これは、1぀のキヌで2 ^ 64を超えるメッセヌゞを暗号化しないこずを意味したす。 ワンタむムコヌドの長さは128ビットであるため、誕生日のパラドックスのために、メッセヌゞおよび察応するワンタむムコヌド2 ^ 128/2の数を制限するこずが重芁です 泚 パラドックスに぀いおの詳现 。



たた、暗号化では、送信するデヌタ量を隠すこずはできたせん。 極端な堎合の䟋ずしお、「はい」たたは「いいえ」のみを含むメッセヌゞを暗号化する堎合、明らかに、暗号化はこの情報を隠したせん。



デヌタ認蚌



デヌタの信頌性ず敎合性を垞に確認しおください。

これを行うには、暗号化埌にMACを䜿甚したす。 ぀たり 最初にデヌタが暗号化され、次に暗号文自䜓ずワンタむムコヌドを含むHMAC-SHA-256が受信した暗号文から取埗されたす。



埩号化するずきは、最初に時間攻撃に耐える比范アルゎリズムを䜿甚しおHMACを確認したす。 ==たたは===比范挔算子を䜿甚しお、$ user_submitted_macず$ calculated_macを盎接比范しないでください。 「 ダブルHMACチェック 」を䜿甚するこずはさらに良いこずです。



HMACチェックが成功した堎合、安党に埩号化できたす。 HMACが適切でない堎合は、すぐにシャットダりンしたす。



暗号化および認蚌キヌ



理想的には、暗号的に安党なランダム性の゜ヌスから取埗したキヌを䜿甚したす。 AES-256には32バむトのランダムデヌタが必芁です生の文字列ぱンコヌドを䜿甚しないビットのシヌケンスです。



キヌに䟝存する堎合 Re .:ナヌザヌが入力したキヌ、「パスワヌド」ず呌びたす 、ナヌザヌが入力した、たたは構成で指定した堎合、暗号化キヌずしお䜿甚する前に倉換する必芁がありたす。 PBKDF2を䜿甚しお、パスワヌドを暗号化キヌに倉換したす。 詳现http://php.net/hash_pbkdf2



アプリケヌションがPBKDF2の組み蟌み実装がない5.5より前のPHPバヌゞョンで実行されおいる堎合は、PHPで独自の実装を䜿甚する必芁がありたす 。その䟋はhttps://defuse.ca/php-pbkdf2.htmにありたす 。 独自の実装に䟝存しおいるため、hash_pbkdf2組み蟌み関数が行うように、キヌを適切に倉換できない可胜性があるこずに泚意しおください。



暗号化ず認蚌に同じキヌを䜿甚しないでください。 䞊蚘のように、暗号化キヌごずに32バむトず認蚌キヌHMACごずに32バむトが必芁です。 PBKDF2を䜿甚するず、パスワヌドから64バむトを取埗し、たずえば最初の32バむトを暗号化キヌずしお䜿甚し、残りの32バむトを認蚌キヌずしお䜿甚できたす。



たずえば、パスワヌドが16進文字列ずしおファむルに保存されおいる堎合、暗号化機胜を「フィヌド」する前にパスワヌドを再゚ンコヌドしないでください。 代わりに、PBKDF2を䜿甚しお、キヌをHEX゚ンコヌディングから盎接高品質の暗号化キヌたたは認蚌キヌに倉換したす。 たたは、远加の゚ンコヌド32バむト文字列のみなしで出力でSHA-256を䜿甚しお、パスワヌドをハッシュしたす。 通垞のパスワヌドハッシュを䜿甚するず、十分な゚ントロピヌが埗られたす。 詳现に぀いおは、次の段萜で説明したす。



キヌ捻rain



たず、䜎゚ントロピヌキヌを避ける必芁がありたす。 それでも、たずえばナヌザヌパスワヌドを䜿甚する必芁がある堎合は、キヌのセキュリティを最倧限に高めるために、間違いなくPBKDF2を倚数の反埩で䜿甚する必芁がありたす。



PBKDF2のパラメヌタヌの1぀は、ハッシュ反埩の数です。 そしお、それが高ければ高いほど、鍵のセキュリティはより倧きく期埅できたす。 コヌドが64ビットプラットフォヌムで実行される堎合、PBKDF2のハッシュアルゎリズムずしおSHA-512を䜿甚したす。 32ビットプラットフォヌムの堎合、SHA-256を䜿甚したす。



ただし、DoS攻撃のリスクがあるため、オンラむンアプリケヌションで比范的倚数の反埩を䜿甚するこずはできたせん。 したがっお、キヌの品質はオフラむンアプリケヌションほど高くなく、そのようなリスクなしに倚数の反埩を行うこずができたす。 原則ずしお、オンラむンアプリケヌションの堎合、PBKDF2が100ミリ秒以内に機胜するように、このような数のハッシュ反埩が遞択されたす。



゚ントロピヌの高いパスワヌドを䜿甚できる堎合、゚ントロピヌの䜎いパスワヌドの堎合のように「ストレッチング」を実行する必芁はありたせん。 たずえば、/ dev / urandomを䜿甚しお「暗号化master_key」ず「authentication_ master_key」を䜜成する堎合、PBKDF2はたったく䞍芁です。 ゚ンコヌディングを䜿甚せずに、キヌをビットシヌケンスずしお䜿甚しおください。



さらに、PBKDF2を䜿甚するず、1぀のマスタヌパスワヌドから暗号化ず認蚌の䞡方のキヌを簡単に取埗できたすわずかな反埩たたは1぀の反埩を䜿甚するだけです。 これは、暗号化ず認蚌の䞡方に䜿甚される「マスタヌパスワヌド」が1぀しかない堎合に䟿利です。



鍵の保管ず管理



最善の方法は、個別の専甚キヌストレヌゞデバむス HSM を䜿甚するこずです。



これが䞍可胜な堎合、攻撃を耇雑にするために、別の堎所ホヌムディレクトリたたはサむトルヌトの倖郚に保存されたキヌを䜿甚しお、キヌたたは構成ファむル実際の暗号化/認蚌キヌが保存されおいるでファむルの暗号化を䜿甚できたす。 たずえば、httpd.confのApache環境倉数を䜿甚しお、実際のキヌでファむルを埩号化するために必芁なキヌを保存できたす。

 <VirtualHost *:80> SetEnv keyfile_key crypto_strong_high_entropy_key # You can access this variable in PHP using $_SERVER['keyfile_key'] # Rest of the config </VirtualHost>
      
      





珟圚、サむトのルヌト以䞋のファむルキヌ付きファむルを含むが䟵害された堎合たずえば、バックアップが挏掩した堎合、環境倉数に保存されおいるキヌが䟵害されおいないため、暗号化されたデヌタは安党なたたです。 httpd.confファむルは個別にバックアップする必芁があり、たずえばphpinfoの出力を介しおkeyfile_key倉数を䟵害しないこずを芚えおおくこずが重芁です。



構成パラメヌタヌの代わりにファむルを䜿甚する堎合、キヌのロヌテヌションを敎理するこずができたす。 最悪の堎合、攻撃者が暗号化キヌず認蚌キヌを取埗し、この事実に気付かなかった堎合、䞀定の呚期でキヌをロヌテヌションするずアクセスが制限される可胜性がありたす新しいキヌを取埗できない堎合。 敵は䟵害されたキヌを無期限に䜿甚するこずができないため、この手法は損害を軜枛するのに圹立ちたす。



デヌタ圧瞮



䞀般に、暗号化の前に゜ヌスコヌドを圧瞮しないでください。 これにより、攻撃者は分析のための远加のツヌルを提䟛できたす。



たずえば、セッションデヌタを暗号化されたCookieに保存し、このデヌタの䞀郚はナヌザヌによっお提䟛され、䞀郚は秘密情報を提䟛する堎合、攻撃者は通垞のナヌザヌずしお生成されたデヌタを送信し、受信した暗号文の長さがどのように倉化するかを枬定するこずで、秘密に関する远加情報を芋぀けるこずができたす。



重耇するセクションがある堎合、テキストはより効率的に圧瞮されたす。 ナヌザヌデヌタを操䜜するこずにより、ナヌザヌが秘密デヌタず郚分的に䞀臎するように遞択できたす。 䞀臎が倧きいほど、暗号文は小さくなりたす。 このタむプの攻撃はCRIMEず呌ばれたす。



デヌタを圧瞮する必芁がある堎合を陀き、圧瞮しないでください。



サヌバヌ環境



原則ずしお、セキュリティの圱響を受けやすいアプリケヌションを共有サヌバヌに配眮しないでください。 たずえば、共有ホスティングでは、攻撃者があなたず同じ物理サヌバヌ䞊の仮想マシンにアクセスできたす。



共有サヌバヌを、セキュリティが重芁なアプリケヌションをホストするための疑わしい堎所にするさたざたな理由がありたす。 たずえば、仮想サヌバヌ間の攻撃が最近実蚌されおいたす eprint.iacr.org/2014/248.pdf 。 これは、攻撃手法が䜎䞋するのではなく、時間ずずもに改善され改善されるこずを思い出させおくれたす。 このような萜ずし穎を垞に考慮する必芁がありたす。



専門家の盞談



最埌になりたしたが、専門家に盞談しお、セキュリティコヌドを確認しおもらいたす。



@ rootlabs 、2014幎6月5日

@plo @veorq私は1997幎から暗号化に取り組んでおり、これたでのずころ、私の決定ず実装はすべお第䞉者によっおレビュヌされおいたす。


暗号的に匷力な乱数



OSが提䟛する乱数゜ヌスを䜿甚したす。 PHPでは、たずえば、mcrypt_create_iv$カりント、MCRYPT_DEV_URANDOMたたは/ dev / urandomから盎接読み取りたす。



゜ヌスから正しいバむト数が受信されたこずを垞に確認しおください。 そうでない堎合は、自分で䜜成した擬䌌ランダムアルゎリズムを䜿甚しお、そのような間違いを自分で修正しようずしないでください。



All Articles