[[Open棟梁Project>http://opentouryo.osscons.jp/]] - [[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]] -[[戻る>.NET開発]] * 目次 [#ba3e104c] #contents *概要 [#i831ac3c] 一通り揃っている。 -ハッシュ --暗号ハッシュ([[様々な用途>https://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0#.E7.94.A8.E9.80.94]]に利用可能) --キー付きハッシュ([[署名・検証>https://ja.wikipedia.org/wiki/%E6%9A%97%E5%8F%B7%E5%AD%A6%E7%9A%84%E3%83%8F%E3%83%83%E3%82%B7%E3%83%A5%E9%96%A2%E6%95%B0#.E7.94.A8.E9.80.94]]にも利用可能) -暗号(暗号化・復号化、署名・検証に利用可能) --秘密鍵暗号方式 --公開鍵暗号方式 -署名(署名・検証に利用可能) --公開鍵暗号方式 -乱数生成、キー生成 *Managed、CSP、CNG実装とは? [#fde2f12c] -Managedで終わる名称のProviderは、.NET実装と思われる(mscorlib.dll)。 -CryptoServiceProvider(CSP)で終わる名称のProviderは、「暗号化サービス プロバイダー (CSP) を使用する」とある(System.Core.dll)。 -Cngで終わる名称のProviderは、PlatformNativeのCryptography Next Generation (CNG) 実装を使用している(System.Core.dll)。 **参考 [#le45730f] ***CSP [#n13961a2] -CryptoAPI Cryptographic Service Providers (Windows)~ https://msdn.microsoft.com/ja-jp/library/windows/desktop/bb931357.aspx -Cryptographic API - Wikipedia~ https://ja.wikipedia.org/wiki/Cryptographic_API ***CNG [#if785c4b] -CNGとは (Cryptography Next Generation) シーエヌジー: - IT用語辞典バイナリ~ http://www.sophia-it.com/content/Cryptography+Next+Generationax -Cryptography Next Generation~ https://technet.microsoft.com/en-us/library/532ac164-da33-4369-bef0-8f019d5a18b8 **どれを使用すべき? [#ub3ba427] -.NET Framework の暗号モデル~ https://msdn.microsoft.com/ja-jp/library/0ss79b2x.aspx には、以下のようにある。 ***最適な実装を選択可能 [#f3be9d35] -マネージ実装~ .NET Framework をサポートするすべてのプラットフォームで利用可能。~ ただし、マネージ実装はFIPSに認定されておらず、ラッパー クラスよりも低速である場合がある。 -CAPI 実装~ CSPラッパー。以前のOSで使用可能だが、開発中止となっている。 -CNG 実装~ CNGラッパー。まさに最新の実装であり、新しい開発が行われる。 ***アルゴリズムの選択 [#uf945e7e] -データのプライバシー~ Aes -データの整合性 --HMACSHA256 --HMACSHA512 -デジタル署名 --ECDsa --RSA(RS256) -キー交換 --ECDiffieHellman --RSA(RS256) -乱数生成~ RNGCryptoServiceProvider -パスワードからのキー生成~ Rfc2898DeriveBytes ***CngKey [#v4011842] -How to use RSA in .NET: RSACryptoServiceProvider vs. RSACng and good practise patterns - Dusted Codes~ https://dusted.codes/how-to-use-rsa-in-dotnet-rsacryptoserviceprovider-vs-rsacng-and-good-practise-patterns 以下の様な違いがあるが、 >RSACngのキーはCngKeyクラスによって管理され、RSACngのコンストラクタに注入できますが、~ RSACryptoServiceProviderは独自のキー操作に結びついています。 [[どちらでも良さそう。>#f3be9d35]] ***性能 [#h1bd7d6f] -Measuring the performance of AES implementations in .Net Framework (AesManaged vs AesCryptoServiceProvider) - CodeProject~ https://www.codeproject.com/Tips/844795/Measuring-the-performance-of-AES-implementations-i *.NETの暗号化Providerの列挙 [#da2f4388] **ハッシュ [#de661712] ***暗号ハッシュ(HashAlgorithm) [#l1894cde] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hashalgorithm.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.md5.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.md5cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.md5cryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ripemd160.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ripemd160managed.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha1.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha1cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha1cryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256cryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha256managed.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384cryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha384managed.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512cng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512cryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.sha512managed.aspx ***キー付きハッシュ(KeyedHashAlgorithm) [#x4fe1902] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.keyedhashalgorithm.aspx -System.Security.Cryptography.HMAC~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmac.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacmd5.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacripemd160.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha1.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha256.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha384.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.hmacsha512.aspx -System.Security.Cryptography.MACTripleDES~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.mactripledes.aspx **暗号化 [#pdc25f19] ***秘密鍵暗号方式(SymmetricAlgorithm) [#r45cd534] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.symmetricalgorithm.aspx -System.Security.Cryptography.Aes~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aes.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aescng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aescryptoserviceprovider.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.aesmanaged.aspx -System.Security.Cryptography.DES~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.des.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.descryptoserviceprovider.aspx -System.Security.Cryptography.RC2~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rc2.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rc2cryptoserviceprovider.aspx -System.Security.Cryptography.Rijndael~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rijndael.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rijndaelmanaged.aspx -System.Security.Cryptography.TripleDES~ https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledes.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledescng.aspx --https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.tripledescryptoserviceprovider.aspx ***公開鍵暗号方式(AsymmetricAlgorithm) [#q04bc939] AsymmetricAlgorithmの内、暗号化・復号化が可能な公開鍵暗号方式は、RS256(RSA)のみ。 https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.asymmetricalgorithm.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacryptoserviceprovider.aspx **署名・検証(AsymmetricAlgorithm) [#lf5eb161] 署名・検証は、AsymmetricAlgorithmの内の、以下のProviderを使用する。~ なお、RS256(RSA)は、暗号化・復号化だけでなく、署名・検証にも利用可能である。 https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.asymmetricalgorithm.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rsacryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.dsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.dsacryptoserviceprovider.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ecdsacng.aspx -https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.ecdiffiehellmancng.aspx **乱数生成、キー生成 [#feec3024] ***乱数生成 [#z6a6e8e6] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rngcryptoserviceprovider(v=vs.110).aspx RNGCryptoServiceProviderを使用する。~ Membership.GeneratePasswordも下位でRNGCryptoServiceProviderを使用している。 -GeneratePassword Method~ http://aspnet.4guysfromrolla.com/demos/GeneratePassword.aspx --This demo illustrates how to use the code for ASP.NET 2.0's Membership.GeneratePassword() method in ASP.NET 1.x. -- I 'borrowed' this code from the 2.0 .NET Framework using [[Reflector>http://www.aisto.com/roeder/dotnet/]]. ***キー生成 [#ta70b091] https://msdn.microsoft.com/ja-jp/library/system.security.cryptography.rfc2898derivebytes.aspx Rfc2898DeriveBytesを使用する。 主に、 -キー付きハッシュ(KeyedHashAlgorithm) -秘密鍵暗号方式(SymmetricAlgorithm) のキーを生成する(パスワードをそのまま使用しない)。 *参考 [#mf5f8a70] **DOBON.NET: VB.NET, C#, 無料ソフトウェア... [#j2316c2c] http://dobon.net/index.html -文字列、暗号化: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/index.html ***暗号ハッシュ [#bbfd012a] -MD5やSHA1などでハッシュ値を計算する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/md5.html -ファイルのMD5やSHA1などでハッシュ値を計算する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/filemd5.html ***秘密鍵暗号方式 [#geb60fa1] -パスワードで文字列を暗号化する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/encryptstring.html -パスワードでファイルを暗号化する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/encryptfile.html ***公開鍵暗号方式 [#icf617f4] -公開鍵暗号方法で暗号化する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/rsaencryption.html ***署名・検証 [#f3bcf75f] -デジタル署名を作成、検証する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/digitalsignature.html ***乱数生成、キー生成 [#gb1f54a6] -乱数を生成する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/programing/random.html -パスワードのようなランダムな文字列を生成する: .NET Tips: C#, VB.NET~ http://dobon.net/vb/dotnet/string/generatepassword.html **Open棟梁の暗号ラッパー [#he1630c1] -Managed優先、無ければCSPを使用というポリシーで実装。 -CNG実装への移行は、まだ行っていない。 ***暗号ハッシュ [#la4e1baf] https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/Util/GetHash.cs#L162 -Managed優先、無ければCSPを使用というポリシーで実装。 -Membership.GeneratePasswordを使っている。~ RNGCryptoServiceProviderに変更したい。 --ASP.NETを使ってランダムなパスワードを生成する:CodeZine(コードジン)~ https://codezine.jp/article/detail/238 ---GeneratePassword Method~ http://aspnet.4guysfromrolla.com/demos/GeneratePassword.aspx ***キー付きハッシュ [#o0ef5dab] https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/Util/GetKeyedHash.cs#L182 -Managedのsuffixが無いが、MSDNではmscorlib.dllとなっているためManaged実装と思われる。 -キーは、Rfc2898DeriveBytesを使用して生成している。 -HMACの実装が不足している。 --HMACSHA1のみ実装 --HMACMD5、HMACRIPEMD160、HMACSHA256、HMACSHA384、HMACSHA512が未実装。 ***秘密鍵暗号方式 [#m1c66e75] https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/IO/SymmetricCryptography.cs#L430 -AesCryptoServiceProviderが例外的に余分に実装されている。 -キーは、Rfc2898DeriveBytesを使用して生成している。 ***公開鍵暗号方式 [#r9036717] https://github.com/OpenTouryoProject/OpenTouryo/blob/develop/root/programs/C%23/Frameworks/Infrastructure/Public/IO/ASymmetricCryptography.cs -暗号化・複合化で使用できるのは、RSACryptoServiceProviderのみ。 ***署名・検証 [#s1ca647e] なし。 ***乱数生成、キー生成 [#q715ba2e] なし。 -乱数発生にはRNGCryptoServiceProviderを使ってもイイかもしれない。 ---- Tags: [[:.NET開発]], [[:セキュリティ]], [[:暗号化]], [[:証明書]]