C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ソースコードにパスワードを直書きする

[トピック内 5 記事 (1 - 5 表示)]  << 0 >>

■98878 / inTopicNo.1)  ソースコードにパスワードを直書きする
  
□投稿者/ お肉 (1回)-(2022/01/11(Tue) 10:28:59)

分類:[C#] 

裏口からのc#実践入門という本を読んでいるのですが、その中でパスワードはソースコードに直書きするのではなく、Properties.Settings.Defaultを使うと書かれていました。

そこで2点疑問なのですが、

1.App.configとProperties.Settings.Defaultは何が違うのでしょうか?使い分けはどうしたらいいのでしょうか?
2.Properties.Settings.Defaultの中を見るとXMLで書かれていました。これはコンパイルしてもXMLファイルとして残って誰でも中身を見ることができてしまわないでしょうか?

引用返信 編集キー/
■98880 / inTopicNo.2)  Re[1]: ソースコードにパスワードを直書きする
□投稿者/ 魔界の仮面弁士 (3273回)-(2022/01/11(Tue) 11:20:10)
2022/01/11(Tue) 11:23:46 編集(投稿者)

No98878 (お肉 さん) に返信
> 1.App.configとProperties.Settings.Defaultは何が違うのでしょうか?使い分けはどうしたらいいのでしょうか?
app.config はファイルの名前ですね。これはアプリケーション構成ファイルとも呼ばれます。
コンパイルすると yourappname.exe.config ファイルとして展開され、既定のパスに配置されます。
http://surferonwww.info/BlogEngine/post/2019/09/01/where-are-configuration-files.aspx

(実行時に OpenMappedExeConfiguration メソッドを呼び出せば、他のファイルを
 読み込ませるといったことも一応可能ですが、通常はそこまでする必要は無いでしょう)


一方、Properties.Settings.Default はファイルの名前ではありません。

(プロジェクト名.)Properties.Settings クラスの Default プロパティとは、
プロジェクトのプロパティの「設定」タブで記述した内容を簡潔に読み書きできるようにしたものです。

このプロパティは内部で、System.Configuration 名前空間のクラスを呼び出す実装になっています。

コード本体はプロジェクト内の
 /Properties/Setting.settings …… XML ファイル
 /Properties/Settings.Designer.cs …… C# ファイル
として自動生成されます。御自身の環境にもありませんか?

Properties.Settings.Default の場合、値を設定できるのはユーザースコープのものだけです。
アプリケーションスコープの設定は読み取り専用となります。

Properties.Settings.Default だけでは操作できない部分については、プログラムから
System.Configuration 名前空間のクラスを直接利用すること可能です。


> 2.Properties.Settings.Defaultの中を見るとXMLで書かれていました。
Settings.Designer.cs では既定設定が組み込まれており、実行時に構成ファイルが失われていた場合、
コンパイル時点の設定が既定値として取得されるようになっています。
構成ファイルの置き場は複数存在しますし、XML の記述内容にも一定のルールがあります。
構成ファイルを破損させてしまうと、起動できずにエラーとなることもあるのでご注意ください。


> これはコンパイルしてもXMLファイルとして残って誰でも中身を見ることができてしまわないでしょうか?
web.config の場合、構成ファイルはサーバー上にあるわけなので、利用者が読み取ることはできません。
app.config の場合、構成ファイルがローカル上にあるため、利用者が読もうと思えば読み取れてしまいます。

一応 app.config や web.config は、暗号化した状態で保存する機構も
備えてはいますが…分かっていれば解読もできるわけで。
https://techinfoofmicrosofttech.osscons.jp/index.php?%2A.config%E3%81%AE%E6%9A%97%E5%8F%B7%E5%8C%96

なので、たとえば SQL Server や Oracle などに接続する場合、パスワードで認証するのではなく、
Windows 認証を使ってアクセスするといった手段が用いられることもあります。
これなら、パスワードを埋め込む必要がなくなります。
引用返信 編集キー/
■98883 / inTopicNo.3)  Re[1]: ソースコードにパスワードを直書きする
□投稿者/ 魔界の仮面弁士 (3275回)-(2022/01/11(Tue) 12:04:48)
No98878 (お肉 さん) に返信
> 裏口からのc#実践入門という本を読んでいるのですが、
c# ではなく
C# という点はさておき。


> その中でパスワードは
パスワードの利用目的は何ですか?
その要件によって、とりうる手段は様々かと。

たとえば、自分しか使わない PC であるなら、.config 以前の問題として
その PC の内容に他者が侵入できてしまっている時点でセキュリティ欠陥なので
プログラムでどうこうする以前の問題だと考える事もできます。

<a> 他者が容易に読みだせない場所に保存する (web.config など)
<b> そもそも平文でパスワードを保持させないようにする (Windows 認証に切り替えるなど)
<c> 認証画面を起動して、毎回パスワードを入力させる仕組みにする(マイナンバーカード利用時のように)
<d> 気にせず .config に保持してしまう


他者に盗み見られることを恐れる場合は、少し手間ですが、
System.Security.Cryptography 名前空間のクラスを併用する手もあります。


(1) 自作システム内で、ユーザーが入力したユーザー名とパスワードを確認/検証するだけの場合

パスワードそのものを記録するのではなく、ハッシュとソルトを記録します。
レインボーテーブル攻撃に対処するため、ソルトは毎回異なる値を使います。(ソルトは平文で保存しても構いません)
この場合には Rfc2898DerivedBytes クラスを利用すると安全です。

ハッシュは不可逆変換となるため、記録された情報からパスワードを取り出すことができなくなります。
検証時には、ユーザーが入力した値を同じ手順でハッシュ化し、記録した内容と一致するかを確認します。



(2) 他システムと連携するなど、再利用のためにパスワード保存が必要な場合

Windows 2000 以降では、データ保護 API (DPAPI) を利用すると、データを安全に暗号化・復号化できます。
これは、OS が提供するデータ暗号化の仕組みですが、.NET Framework 2.0 以降からは
ProtectedData クラス、ProtectedMemory クラスを通じてアクセスできるようになっています。
(OS 再起動後も保持したい情報には ProtectedData、アプリ起動中のみ保持する情報には ProtectedMemory)

保存したデータは、現在のユーザーのみが読み取れるような場所(アクセス許可が設定されたレジストリやファイルなど)にて
保持してください。なお、取得したパスワードは、String 型として保持するのではなく、
SecureString クラスとして保持することが望ましいです。
引用返信 編集キー/
■98885 / inTopicNo.4)  Re[1]: ソースコードにパスワードを直書きする
□投稿者/ WebSurfer (2405回)-(2022/01/11(Tue) 12:38:57)
No98878 (お肉 さん) に返信

> 1.App.configとProperties.Settings.Defaultは何が違うのでしょうか?

前者は普通の xml ファイル、後者は自動生成された Setteings.Designer.cs ファイルに定義
される Settings クラスのプロパティとして厳密に型指定されている点、スコープをユーザー
にするとそれに set も設定されユーザーが変更できる点、設定ファイルの保存場所が違う点
でしょうか。

詳しいことは以下の記事を見てください。

Settings.settings の使い方
http://surferonwww.info/BlogEngine/post/2021/06/05/how-to-get-and-set-values-in-settings-file.aspx

構成ファイルの保存場所
http://surferonwww.info/BlogEngine/post/2019/09/01/where-are-configuration-files.aspx

> 使い分けはどうしたらいいのでしょうか?

Visual Studio のウィザードを使って型付 DataSet 等を作ると接続文字列は自動的に Settings.settings
ファイルに保存されます。そのばあいは、そのまま Settings.settings を使えばよいと思います。

自分で設定する場合でも、厳密に型指定されている Settings.settings の方が良さそうだと思います。

> 2.Properties.Settings.Defaultの中を見るとXMLで書かれていました。これはコンパイル
> してもXMLファイルとして残って誰でも中身を見ることができてしまわないでしょうか?

その通りで、上で紹介した「構成ファイルの保存場所」に xml ファイルとして保存されているので
ユーザーはメモ帳で開いて中身を読むことができます。

引用返信 編集キー/
■98886 / inTopicNo.5)  Re[1]: ソースコードにパスワードを直書きする
□投稿者/ WebSurfer (2406回)-(2022/01/11(Tue) 12:51:57)
No98878 (お肉 さん) に返信

そもそもの話ですが、

> 裏口からのc#実践入門という本を読んでいるのですが、その中でパスワードはソースコード
> に直書きするのではなく、Properties.Settings.Defaultを使うと書かれていました。

・・・はどういう意図なのでしょう?

開発環境と運用環境で異なる接続文字列のようなものはハードコーディングするのでなく、開発
時に設定ファイルに保存しておけば、運用の際差し替えが容易という話から来ているケースが
多いと思うのですが、それとは違う話ですか?(セキュリティとか暗号化の話ではなくて)

引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ