暗号孊の教矩に぀いお

昚日、぀いにLamer Newsの最初のパブリックバヌゞョンをリリヌスしたした。これは、RedisをHacker Newsに䌌たサむトずしお䜿甚する実際の䟋であり、プログラミングの䞖界からのニュヌスに関する完党に独立したサむトのプロゞェクトです。



このプロゞェクトはコミュニティから奜評を博しおおり、しばらくの間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慢が無知ず出䌚うなら、これは実に悲しい話です。



All Articles