スタン・ドラプキン。 .NETの高レベル暗号化トラップ

Stan Drapkinは、.NET Frameworkの16幎以䞊の経隓を持぀セキュリティおよびコンプラむアンスの専門家です2001幎の.NET 1.0-beta以降。 残念ながら、圌自身はロシア語で蚘事を曞いおいないので、 圌のレポヌトの翻蚳をDotNext Piterでリリヌスするこずに同意したした。 このレポヌトは䌚議で1䜍になりたした



察称暗号化、非察称、ハむブリッド、高レベル、䜎レベル、ストリヌムおよび最新の楕円暗号。 暗号化に関するビデオの56分、およびはるかに高速-テキストの圢匏で。







カットの䞋-ビデオ、スラむド、翻蚳。 読曞をお楜しみください





スラむド



私の名前はスタン・ドラプキンです。私は情報セキュリティず芏制順守を専門ずする䌚瀟のテクニカルディレクタヌです。 さらに、私はいく぀かのオヌプン゜ヌスラむブラリの䜜成者でもあり、それらはコミュニティから非垞に奜評です。 むンフェルノを聞いた人は䜕人ですか このラむブラリは、.NETでの暗号化ぞの正しいアプロヌチを瀺しおおり、 TinyORMは.NETのmicro-ORMを実装しおいたす。 さらに、今日の蚘事のトピックに関連する可胜性のある本をいく぀か曞いおいたす。 その1぀である2014幎版は「Security Driven .NET」であり、2017幎のもう1぀は「Application Security in .NET、Succinctly」です。



最初に、暗号化啓発の4぀の段階ず呌ぶものに぀いお説明したす。 次に、2぀の䞻芁なトピックが続きたす。最初のトピックでは察称暗号化に぀いお、2番目のトピックでは非察称およびハむブリッドに぀いお説明したす。 最初の郚分では、高レベル暗号ず䜎レベル暗号を比范し、ストリヌミング暗号の䟋を芋おみたしょう。 第2郚では、RSAで倚くの「冒険」を行い、その埌、珟代の楕円暗号に粟通したす。



では、暗号化啓発のこれらの段階はどのように芋えるのでしょうか 最初の段階は、「XORはずおもクヌルだ、芋お、お母さん、どうすればいいか」です。あなたの倚くはきっずこの段階に粟通しおおり、XOR機胜の玠晎らしさを知っおいたす。 しかし、この段階の倧郚分が成長し、次の段階、぀たり広く知られ、高く評䟡されおいるアルゎリズムであるAESAdvanced Encryption Standardを䜿甚しお暗号化ず埩号化を実行するこずを孊んだこずを願っおいたす。 DotNextにアクセスしないほずんどの開発者はこの段階です。 しかし、DotNextに埓い、䜎レベルAPIの危険性に関するレポヌトに粟通しおいるため、次の段階にいる可胜性が高いでしょう。 たあ、党䜓像を完成させるために、最埌の段階にも蚀及したす-問題に察する最善の解決策では、暗号化はたったく必芁ないかもしれないずいう理解です。 この段階は到達するのが最も難しく、人がほずんどいたせん。 たずえば、ピヌタヌG.ノむマンは次のように語っおいたす。「問題の解決策が暗号化にあるず考えおいる堎合、問題の内容を正確に理解するこずはできたせん。」



䜎レベル暗号化が危険であるずいう事実は、.NETに関する倚くのレポヌトで議論されおいたす。 2015幎のVladimir Kochetkovのレポヌト「Pitfalls of System.Security.Cryptography」を参照できたす 。 圌の䞻なアむデアは、䜎レベルの暗号化APIを䜿甚する各段階で、知らないうちに倚くの決定を䞋すこずであり、その倚くに぀いおは適切な知識がありたせん。 䞻な結論は、理想的には、䜎レベル暗号化の代わりに高レベル暗号化を䜿甚する必芁があるずいうこずです。 これは玠晎らしい結論ですが、別の問題に぀ながりたす-高レベルの暗号化がどのように芋えるべきかを正確に知っおいたすか それに぀いお少し話したしょう。



非高レベル暗号化APIの属性を定矩したす。 そもそも、このようなAPIは.NETにネむティブであるずいう印象を䞎えるのではなく、䜎レベルのシェルのように芋えたす。 さらに、そのようなAPIは簡単に誀っお䜿甚されたす。 そうではありたせん。 さらに、ノンス、初期化ベクトルなど、倚くの奇劙な䜎レベルのものを生成するこずを匷制したす。 このようなAPIを䜿甚するず、アルゎリズム、パディングモヌド、キヌサむズ、ノンスなどを遞択するのではなく、䞍快な刀断を䞋すこずになりたす。 たた、ストリヌミング甚の正しいAPIストリヌミングAPIもありたせん。埌者の倖芳に぀いお説明したす。



察照的に、高レベルの暗号化APIはどのように芋えるべきですか そもそも、コヌドの読み取りず曞き蟌みの䞡方に぀いお、盎感的か぀簡朔でなければなりたせん。 さらに、このようなAPIは簡単に習埗しお䜿甚でき、間違った方法で適甚するこずは非垞に難しいはずです。 たた、匷力である必芁がありたす。぀たり、少しの劎力ず少量のコヌドで目暙を達成できる必芁がありたす。 最埌に、このようなAPIには䞀般に制限、譊告、特殊なケヌスの長いリストを含めるべきではありたせん-それを操䜜する際に芚えおおく必芁のある最小限のものがあるはずです-蚀い換えれば、䜎レベルの干枉䜎摩擊によっお特城付けられるべきです予玄なしで動䜜したす。



.NETの高レベル暗号化APIの芁件を理解したので、今どのようにそれを芋぀けるのでしょうか あなたはただグヌグルを詊すこずができたすが、それはあたりにも原始的です-私たちはプロの開発者であり、これは私たちの方法ではありたせん。 そのため、この問題を調査し、さたざたな遞択肢をテストしおいたす。 ただし、このためには、たず、認蚌された暗号化ずは䜕かずいう正しい考えを自分自身で補う必芁があり、そのためには基本的な抂念を理解する必芁がありたす。 それらは次のずおりです。プレヌンテキストPプレヌンテキスト。これは、秘密キヌKキヌを䜿甚しお同じ長さの暗号テキストC暗号テキストに倉換したす。 ご芧のずおり、これたでのずころ、非垞に単玔なスキヌムを䜿甚しおいたす。 さらに、認蚌タグTずnonce Nもありたす。重芁なパラメヌタヌはN̅です。぀たり、1぀のキヌでnonceを再利甚したす。 おそらくご存知のように、それはテキストの機密性の䟵害に぀ながりたすが、これは明らかに望たしくありたせん。 もう1぀の重芁な抂念はAD関連デヌタ、぀たり関連デヌタです。 これは認蚌されるオプションのデヌタですが、暗号化ず埩号化には関䞎したせん。







基本抂念を理解したので、.NETの暗号化ラむブラリのさたざたなオプションを芋おみたしょう。 Libsodium.NETを分析するこずから始めたしょう。 圌女を䜕人知っおいたすか 私が芋るように、いく぀かはおなじみです。



nonce = SecretAeadAes.GenerateNonce(); c = SecretAeadAes.Encrypt(p, nonce, key, ad); d = SecretAeadAes.Decrypt(c, nonce, key, ad);
      
      





暗号化がLibsodium.NETで実行されるCコヌドは次のずおりです。 䞀芋するず、それは非垞にシンプルで簡朔です。1行目ではノンスが生成され、2行目では暗号化自䜓が行われ、3行目ではテキストが埩号化されたす。 それは思われた-どのような困難がある可胜性がありたすか そもそも、Libsodium.NETは察称暗号化の1぀ではなく3぀の異なる方法を提䟛したす



回



 nonce = SecretAeadAes.GenerateNonce(); c = SecretAeadAes.Encrypt(p, nonce, key, ad); d = SecretAeadAes.Decrypt(c, nonce, key, ad);
      
      





二



 nonce = SecretAead.GenerateNonce(); c = SecretAead.Encrypt(p, nonce, key, ad); d = SecretAead.Decrypt(c, nonce, key. ad);
      
      





侉



 nonce = SecretBox.GenerateNonce(); c = SecretBox.Create(p, nonce, key); d = SecretBox.Open(c, nonce, key);
      
      





明らかに、問題が発生したす-あなたの特定の状況でどちらが良いですか それに答えるには、これらのメ゜ッドの内郚に入る必芁がありたす。



最初のメ゜ッドSecretAeadAes



は、96ビットのノンスでAES-GCMを䜿甚したす。 圌がかなり長い制限リストを持っおいるこずが重芁です。 たずえば、それを䜿甚する堎合、1぀のキヌで550ギガバむトを超えお暗号化するべきではありたせん。たた、1぀のメッセヌゞで最倧2 32のメッセヌゞを含む64ギガバむトを超えおはなりたせん。 さらに、ラむブラリはこれらの制限に近づいおいるこずを譊告しおいたせん。あなたはそれらを自分で远跡する必芁があり、開発者ずしおあなたに远加の負担をかけたす。



2番目の方法であるSecretAead



は、異なる暗号スむヌトChaCha20/Poly1305



し、倧幅に小さい64ビットのナンスを䜿甚したす。 このような小さなナンスは衝突を極めお可胜性が高いため、この理由だけで、この方法は䜿甚しないでください-非垞にたれなケヌスを陀き、トピックに粟通しおいる堎合を陀きたす。



最埌に、3番目のメ゜ッドSecretBox



。 このAPIの匕数には関連するデヌタがないこずに泚意しおください。 ADで認蚌された暗号化が必芁な堎合、この方法は適しおいたせん。 ここで䜿甚される暗号化アルゎリズムはxSalsa20/Poly1305



ず呌ばれ、ノンスは十分に倧きいxSalsa20/Poly1305



ビットです。 ただし、ADの欠劂は重倧な制限です。



Libsodium.NETを䜿甚するず 、いく぀かの疑問が生じたす。 たずえば、䞊蚘の䟋のコヌドの最初の行で生成されたノンスを䜿甚しお、正確に䜕をすべきでしょうか ラむブラリはこれに぀いお䜕も教えおくれたせん。私たちは自分でそれを理解しなければなりたせん。 ほずんどの堎合、このノンスを暗号文の最初たたは最埌に手動で远加したす。 さらに、最初の2぀の方法のADの長さには制限がないずいう印象を受けるかもしれたせん。 しかし、実際には、ラむブラリは16バむト以䞋のADをサポヌトしおいたす。結局のずころ、16バむトで十分です。 続けたしょう。 埩号化゚ラヌはどうなりたすか このラむブラリでは、これらの堎合に䟋倖をスロヌするこずが決定されたした。 埩号化䞭の環境でデヌタの敎合性が䟵害される可胜性がある堎合、倚くの䟋倖を凊理する必芁がありたす。 キヌサむズが正確に32バむトではない堎合はどうなりたすか ラむブラリはこれに぀いおは䜕も教えおくれたせん。これらはあなたが興味を持たない問題です。 別の重芁なトピックは、集䞭的なシナリオでガベヌゞコレクタヌの負荷を軜枛するためのバむト配列の再利甚です。 たずえば、コヌドでは、nonceゞェネレヌタヌが返す配列を確認したした。 毎回新しいバッファを䜜成するのではなく、既存のバッファを再利甚したいず思いたす。 これはこのラむブラリでは䞍可胜であり、バむトの配列は毎回再生成されたす。



すでに芋たスキヌムを䜿甚しお、さたざたなLibsodium.NETアルゎリズムの比范を詊みたす。







最初のアルゎリズムであるAES-GCMは、96ビット長のノンスを䜿甚したす図の黄色の列。 128ビット未満であるため、倚少の䞍快感が生じたすが、それほど重芁ではありたせん。 次の列は青です。これは認蚌タグが占める堎所で、AES-GCMでは16バむトたたは128ビットです。 括匧内の2番目の青い数字は、このタグに含たれる゚ントロピヌたたはランダム性の量を意味したす-128ビット未満。 どれだけ少ない-このアルゎリズムでは、暗号化されるデヌタの量に䟝存したす。 暗号化するほど、タグは匱くなりたす。 これだけでも、このアルゎリズムに関する疑問が生じるはずであり、癜い列を芋るず増加したす。 ノンスの繰り返し衝突は、同じキヌで䜜成されたすべおの暗号文の停造に぀ながるず蚀われおいたす。 たずえば、2぀の共通キヌによっお䜜成された100個の暗号テキストのうち、ノンスの衝突がある堎合、このノンスは認蚌キヌの内郚リヌクを匕き起こし、攻撃者がこのキヌによっお䜜成された他の暗号テキストを停造できるようにしたす。 これは非垞に重芁な制限です。



2番目のLibsodium.NETメ゜ッドに進みたしょう。 先ほど蚀ったように、ここでは䞀回だけ、䜿甚されるスペヌスが少なすぎお64ビットしかありたせん。 タグは128ビットを占有したすが、゚ントロピヌは106ビット以䞋、぀たり、ほずんどの堎合達成しようずする128ビットのセキュリティレベルよりも倧幅に䜎いです。 停造に関しおは、ここでの状況はAES-GCMの堎合よりも若干良くなっおいたす。 ノンスの衝突は暗号文の改ざんに぀ながりたすが、衝突が発生したブロックのみです。 前の䟋では、100ではなく2぀の暗号文を停造しおいたした。



最埌に、xSalsa / Polyアルゎリズムの堎合、192ビットの非垞に倧きなノンスがあり、衝突が非垞に起こりにくくなりたす。 認蚌方法は前の方法ず同じであるため、タグは再び128ビットを䜿甚し、106ビット以䞋の゚ントロピヌを持ちたす。



これらのすべおの数倀を、 Infernoラむブラリの察応するむンゞケヌタヌず比范したす。 その䞭で、ノンスは、320ビットの巚倧なスペヌスを占有し、衝突をほずんど䞍可胜にしたす。 タグに぀いおは、すべおがシンプルです。正確に128ビットを占有し、正確に128ビットの゚ントロピヌを持っおいたす。 これは、信頌性が高く安党なアプロヌチの䟋です。



Libsodium.NETの詳现を知る前に、その目的を理解する必芁がありたす-残念ながら、このラむブラリを䜿甚するすべおの人が認識しおいるわけではありたせん。 これを行うには、 Libsodium.NETがlibsodiumのCラッパヌであるず述べおいるドキュメントを参照しおください。 これは別のオヌプン゜ヌスプロゞェクトであり、そのドキュメントには、互換性のあるAPIを備えたNaClのフォヌクであるこずが蚘茉されおいたす。 さお、別のオヌプン゜ヌスプロゞェクトであるNaClのドキュメントを参照しおください。 その䞭で、目暙ずしお、 NaClは高床な暗号化ツヌルを䜜成するために必芁なすべおの操䜜を提䟛するず仮定されおいたす。 犬が埋葬されるのはここです。NaClずそのすべおのシェルのタスクは、䜎レベルの芁玠を提䟛するこずです。そこから、誰かがすでに高レベルの暗号化APIを組み立おるこずができたす。 高レベルのラむブラリずしおのこれらのシェル自䜓は考案されおいたせん。 したがっお、モラル高レベルの暗号化APIが必芁な堎合、高レベルのラむブラリを芋぀け、䜎レベルのラッパヌを䜿甚せず、高レベルのラむブラリで䜜業しおいるふりをする必芁がありたす。



Infernoでの暗号化の仕組みを芋おみたしょう。







Libsodiumの堎合のように 、各暗号化ず埩号化に必芁なコヌドは1行のみです。 匕数は、キヌ、テキスト、およびオプションの関連デヌタです。 ノンスがなく、決定を行う必芁がないこずに泚意する必芁がありたす。埩号化゚ラヌの堎合、䟋倖をスロヌせずにnullが返されるだけです。 䟋倖を䜜成するず、ガベヌゞコレクタの負荷が倧幅に増加するため、䟋倖が存圚しないこずは、倧きなデヌタストリヌムを凊理するスクリプトにずっお非垞に重芁です。 このアプロヌチが最適であるず玍埗できたこずを願っおいたす。



興味深いこずに、文字列を暗号化しおみたしょう。 これは、誰でも実装できる最も単玔なシナリオでなければなりたせん。 「LEFT」ず「RIGHT」の2぀の異なる文字列倀しか䜿甚できないずしたす。







写真では、 Infernoを䜿甚したこれらの行の暗号化を確認できたすただし、この䟋では、䜿甚するラむブラリは関係ありたせん。 1぀のキヌで2行を暗号化し、2぀の暗号文c1



ずc2



を取埗したす。 このコヌドのすべおが正しいですか 圌は生産の準備ができおいたすか 誰かが問題は短期間で可胜だず蚀うかもしれたせんが、それは䞻芁な問題からはほど遠いので、キヌは同じように䜿甚され、十分な長さがあるず仮定したす。 c1



、埓来の暗号化アプロヌチでは、この䟋のc1



はc2



よりも短くなりたす。 これは長さリヌクず呌ばれたす。倚くの堎合、 c2



はc1



より1バむト長くなりたす。 これにより、攻撃者は、この暗号化テキスト「LEFT」たたは「RIGHT」で衚される文字列を理解できたす。 この問題を解決する最も簡単な方法は、䞡方の行の長さを同じにするこずです。たずえば、LEFT行の最埌に文字を远加したす。



䞀芋したずころ、長さの挏れは、実際のアプリケヌションでは発生し埗ない、やや倧げさな問題ずしお認識されおいたす。 しかし、2018幎1月に、「Tinderに暗号化がないため、画面をスワむプしたずきに郚倖者が远跡できる」ずいう芋出しの䞋で、むスラ゚ルの䌚瀟Checkmarxが実斜した調査による蚘事がWired誌に掲茉されたした。 コンテンツに぀いお簡単に説明したすが、最初にTinder機胜の倧たかな説明をしたす。 Tinderは、写真付きのストリヌムを受信し、写真が奜きかどうかに応じお、画面を右たたは巊にスワむプするアプリケヌションです。 研究者は、コマンド自䜓はTLSずHTTPSを䜿甚しお正しく暗号化されおいたすが、右偎のコマンドのデヌタは巊偎のデヌタずは異なるバむト数を必芁ずするこずを発芋したした。 これはもちろん脆匱性ですが、それ自䜓はそれほど重芁ではありたせん。 Tinderにずっおより重芁なのは、暗号化なしで、通垞のHTTP経由で写真付きのストリヌムを送信したずいう事実です。 そのため、攻撃者は写真に察するナヌザヌの反応だけでなく、写真自䜓にもアクセスする可胜性がありたす。 したがっお、ご芧のずおり、長さのリヌクは非垞に珟実的な問題です。



次に、ファむルを暗号化しおみたしょう。 すぐに、 Libsodium.NETファむル暗号化、たたはもっず広く蚀えば、ストリヌム暗号化はデフォルトでは実装されおおらず、手動で行わなければならないこずを蚀わなければなりたせん。 Infernoの方がはるかに優れおいたす。







䞊蚘の䟋は、MSDNからほずんど倉曎を加えずに撮圱した䟋です。 これは非垞に簡単です。ここでは、゜ヌスファむル甚のストリヌムず宛先ファむル甚のストリヌムのほか、最初のストリヌムを2番目に倉換する暗号化ストリヌムがありたす。 このコヌドでは、 Infernoは 1行でのみ䜿甚されたす-倉換が行われる行で。 ですから、私たちの前にあるのは、ストリヌムを暗号化するためのシンプルか぀同時に完党に機胜し、テストされた゜リュヌションです。



同じキヌで暗号化する堎合、メッセヌゞ数に制限があるこずに泚意しおください。 それらはInfernoに存圚し、このラむブラリでは画面䞊に明確に曞かれおいたす。 しかし、同時に、それらはむンフェルノでは非垞に倧きいため、実際には到達するこずはありたせん。 Libsodium.NETでは、制限はアルゎリズムごずに異なりたすが、すべおの堎合においお、それを超えるには十分に䜎いです。 したがっお、個々のシナリオでそれらが達成されるかどうかを確認する必芁がありたす。



たた、関連するデヌタの認蚌に぀いおも説明する必芁がありたす。これは、あたり取り䞊げられないトピックであるためです。 ADは「匱い」可胜性がありたす。これは、認蚌されおいるこずを意味したすが、暗号化および埩号化プロセス自䜓には関䞎しおいたせん。 察照的に、「匷力な」ADはこのプロセス自䜓を倉曎したす。 私が知っおいるほずんどのADラむブラリは脆匱ですが、 Infernoは暗号化/埩号化プロセス自䜓でADが䜿甚される2番目のアプロヌチを䜿甚しおいたす...



たた、高レベルの暗号化のためにどのレベルのセキュリティが努力すべきかに぀いおも怜蚎する必芁がありたす。 芁するに、私の答えは次のずおりです。128ビット認蚌タグを䜿甚した256ビット暗号化。 キヌがそんなに倧きいのはなぜですか これには倚くの理由がありたすが、それぞれが重芁ですが、暗号キヌを生成する際にバむアスから身を守る必芁があるずいうこずを芚えおおいおください。 バむアスの意味を説明したしょう。 バむアスのないランダムビットゞェネレヌタヌの堎合、各ビットに぀いお、倀0たたは1を受け入れる確率は等しくなりたす。 しかし、ゞェネレヌタで、ビットが50ではなく56の確率で倀1を取るず仮定したす。 䞀芋したずころ、このバむアスは小さいですが、実際には25ずいう倧きなものです。 ここで、ゞェネレヌタヌで特定のビット数を生成するずきに埗られる゚ントロピヌの量を蚈算しおみたしょう。







写真には、この蚈算が行われる匏が衚瀺されたす。 重芁なのは、倉数が2぀しかないこずです。すでに説明したバむアスバむアスず、ゞェネレヌタヌによっお䜜成されるビット数です。 バむアスは25であるず仮定したす-これは非垞に極端なケヌスであり、実際には、このような歪んだ乱数ゞェネレヌタヌを備えたシステムでは動䜜しない可胜性がありたす。 25のバむアスず128ビットのキヌを䜿甚するず、53ビットの゚ントロピヌしか埗られない可胜性がありたす。 第䞀に、それは通垞乱数発生噚から期埅される128ビットよりも倧幅に小さく、第二に、珟代の技術では、そのようなキヌは単玔にブルヌトフォヌスになりたす。 ただし、128ビットキヌの代わりに256ビットを䜿甚するず、106ビットの゚ントロピヌが埗られたす。 予想される256よりも少ないものの、これは既に非垞に優れおいたす。最新の技術では、このようなキヌを解読するこずはほずんど䞍可胜です。



レポヌトの最初の郚分の最埌に、䞭間結果を芁玄したす。 誰もが適切に䜜成された暗号化APIを䜿甚するこずをお勧めしたす。 自分に合ったものを芋぀けるか、Microsoftに請願曞を送り、あなたに手玙を曞いおください。 さらに、APIを遞択するずきは、スレッドを操䜜するためのサポヌトの可甚性に泚意する必芁がありたす。 すでに説明した理由により、最小キヌ長は256ビットである必芁がありたす。 最埌に、高レベル暗号化は、他のものず同様に理想的ではないこずを心に留めおおく必芁がありたす。 リヌクが発生する可胜性があり、ほずんどのシナリオでその機胜を念頭に眮いおおく必芁がありたす。



非察称暗号、たたはハむブリッド暗号に぀いお説明したしょう。 私はトリックの質問を投げかけたす.NETでRSAを䜿甚できたすか 倚くの人がそうするように、急いで答えおはいけたせん-最初にこの分野であなたの知識をテストしたしょう。 次のスラむドは、このトピックにすでに粟通しおいる人向けに特別に蚭蚈されおいたす。 しかし、最初にりィキペディアを芋お、誰かがこのアルゎリズムを長い間忘れたり、䜿甚しなかった堎合に備えお、RSAが䜕であるかを芚えおおいおください。







乱数ゞェネレヌタヌを䜿甚しお、1぀のプラむベヌトず1぀のパブリックを含むキヌペアを䜜成するアリスがいるずしたす。 次に、アリス宛のメッセヌゞを暗号化するボブがいたす。「こんにちは、アリス」圌女の公開鍵を䜿甚しお、圌は暗号文を生成し、それを圌女に送信したす。 圌女は自分の鍵の秘密郚分を䜿甚しおこの暗号文を解読したす。



このシナリオを実際に再珟しおみたしょう。







䞊蚘でわかるように、RSAのむンスタンスを䜜成し、テキストを暗号化したす。 .NETがパディングモヌドの遞択を匷制するこずに盎ちに泚意を払っおください。 それらは5぀ありたすが、すべお名前はわかりたせん。 これらすべおを順番に詊しおみるず、最埌の3぀は単に䟋倖をスロヌし、機胜しないこずがわかりたす。 残りの2぀のうちの1぀、 OaepSHA1



たす。 ここで、キヌのサむズは1キロビットで、RSAには小さすぎたすが、実際にはハッキングされたキヌです。 したがっお、キヌサむズを手動で蚭定する必芁がありたす。 ドキュメントから、キヌサむズを受信たたは蚭定する特別なプロパティ.KeySize



があるこずが.KeySize



たす。







䞀芋したずころ、これはたさに私たちが必芁ずするものなので、 rsa.KeySize = 3072



曞きたす。 しかし、あいたいな疑いに導かれた埌、キヌサむズが珟圚䜕に等しいかを確認するず、1キロビットかかるこずがわかりたす。 重芁ではありたせんWriteLine(rsa.KeySize)



メ゜ッドたたはrsa.ExportParameters(false).Modulus.Length * 8



を䜿甚しおこのパラメヌタヌをチェックしたすrsa.ExportParameters(false).Modulus.Length * 8



埌者の堎合、RSAキヌのパブリックコンポヌネントが゚クスポヌトされたす。 このキヌのモゞュラスは配列で、これに8を掛けおビット単䜍のサむズを取埗したす-これも1キロビットになりたす。 ご芧のずおり、このアルゎリズムはただ本番環境に送信するには早すぎたす。



このAPIが機胜しない理由を理解するのに時間を無駄にせず、代わりに、Microsoftが.NET 4.6で提䟛する別のRSA実装、぀たり完党に新しいものを詊しおください。 RSACngず呌ばれ、 Cngは次䞖代暗号化の略です。 次䞖代のツヌルを䜿いたくない人はいたすか きっずここですべおの問題に察する魔法の解決策を芋぀けるでしょう。







RSACngのむンスタンスを芁求し、再びキヌサむズを3キロビットに蚭定し、再びWriteLine(rsa.KeySize)



キヌサむズを確認したす。キヌサむズがただ1キロビットに等しいこずを確認したす。 さらに、キヌを生成したオブゞェクトのタむプをリク゚ストした堎合-思い出したように、RSACngのむンスタンスをリク゚ストしたした-RSACryptoServiceProviderであるこずがわかりたす。 私は自分の絶望感をここで共有したいだけで、「なぜマむクロ゜フトなのか」ず叫ぶだけです。



長い苊痛ず苊痛の埌、実際には工堎ではなくデザむナヌを䜿甚する必芁があるこずがわかりたす。







ここで、デフォルトのキヌサむズの倀は2048ビットですが、これはすでにはるかに優れおいたす。 さらに良いこず-ここで、ようやくキヌサむズを3キロビットに蚭定するこずができたす。 圌らが蚀うように、成果はアンロックされたした。



これたでのすべおの努力はRSAの䜜成にのみ軜枛され、暗号化はただ開始されおいたせん。最初に答える必芁がある質問がただありたす。たず第䞀に、デフォルトのキヌサむズにどの皋床たで䟝存できたすかRSAファクトリの実装はでオヌバヌラむドされる可胜性があるmachine.config



ため、知らないうちに倉曎される堎合がありたすたずえば、システム管理者が倉曎する堎合がありたす。これは、デフォルトのキヌサむズも倉曎できるこずを意味したす。したがっお、デフォルトで提䟛される倀を信頌するべきではありたせん。キヌサむズは垞に独立しお蚭定する必芁がありたす。次に、デフォルトのRSAキヌのサむズはどれくらいですか.NETには2぀のRSA実装があり、1぀はベヌスRSACryptoServiceProvider



、もう1぀はベヌスRSACng



. 1 , . Bitcoin (BCN). , Bitcoin , . hashrate, 2 64 . 2 90 . , — , . , , , , 2 70 ( BCN) , 1- RSA, 2 90 ( BCN) — 2- . — , . , 3 , — 4.



.NET , .







RSA, RSACryptoServiceProvider



, RSACng



, 4 . , . , API — , , . , , , , . RSA , . , API .



, RSA , ; - .







, ( data



), , . . ; ? — Microsoft, , . , . . , . , , . . .



, , SHA-1? SHA-1, , - , - (compliance department) , . OaepSHA1



OaepSHA256



, .







. , , , , .



, , . int GetMaxDataSizeForEnc(RSAEncryptionPadding pad)



, , . , , . , , RSA, . , Microsoft.



, RSA , . , , , API RSA .NET . , , . , 128- 4- . , -, -. . 256- , — 15360 . RSA . . RSA , , , . ? TLS RSA, . , , , , , . , RSA.



, RSA? . ECDSA (Digital Signature Algorithm, « »), RSA . EC — , Elliptic-Curve («»). securitydriven.net/inferno/#DSA Signatures ECDSA, , , .NET. — ECIES (Integrated Encryption Scheme, « »). RSA, , , . securitydriven.net/inferno/#ECIES example. , — ECDH (Diffie-Hellman key exchange, « -»). . ( forward secrecy ). securitydriven.net/inferno/#DHM Key Exchange .



. API, , . RSA. , , , , . RSA. , (ECDSA, ECDH, ECIES). , , , , . StackOverflow, : « . ».



, , , . SecurityDriven.Inferno . « » - (Jean-Philippe Aumasson, Serious Cryptography). . , Application Security in .NET, Succinctly, . .NET. , Slideshare , , .



, . -, , . . .NET — CSRF (Cross-Site Request Forgery, « »), , . — , . , GET. CSRF, HTML «hidden». , cookie-, . POST, . , -, , , -, . . , ASP.NET ASP.NET Core. , CSRF .



, CSRF . , — , , , . . , (injection) , . — , AJAX, — . , , , .







, — . , , . , .



広告の分。 DotNext. DotNext 2018 Moscow — 22-23 2018 - « ».



. , , . ! .




All Articles