0

これはかなり簡単な質問のように思えますが、私は決定的な答えを見つけるのに苦労しています。現在、私はパブリッククラスを持っており、コンストラクターで次のような変数を定義しています。

private String password = "abcd123456";

次に、次のような方法があります。

public String getValue(String inputValue)
{
    String returnValue = encryptor.decrypt(inputValue, password);
    return returnValue;
}

クラスもパブリックとして定義されています。フォームからこのクラスを参照するとき、私はこれを行っています:

ValueGetter vg = new ValueGetter();
String decryptedValue = vg.getValue("xfr3sf342d#2");

パスワードをプライベートとして定義することで、そのクラスだけがパスワードを見ることができると思います。ただし、デバッグ中の場合は、「vg」変数の上にマウスを置いてオブジェクトの内容を表示すると、パスワードがわかりやすく表示されます。変数パスワードをそのクラスだけに認識させ、コンストラクターで定義する方法はありますか?その変数を使用するクラス内には外部フォームから呼び出すことができるいくつかのメソッドがあるので、各メソッドで変数を再定義する必要はなく、コンストラクターにそれを入れたいと思います。

前もって感謝します!

変数を非表示にする最も明白な理由としてパスワードを使用しましたが、実際には、誰かがクラスへのインターフェイスを作成して、何の意味もない大量のゴミを取得することを望んでいません。オブジェクトから。したがって、beachというクラスと、getBeachBallというメソッドがあるかもしれません。オレンジ色で、xxポンドの空気で膨らんだビーチボールなどが返されます。メソッドを含むクラスには、TableShapeという別の変数があります。この色は常に白で、変更できません。tableShapeは、Beachクラスだけが何かに使用するので、マスクできるかどうか疑問に思っていました。元の呼び出し元は、tableColor変数について何も知りません。

4

5 に答える 5

2

何かをプライベートにしても、それが見えなくなるわけではありません。

アクセス修飾子はコンパイラ用であり、コードからアクセスする方法を決定します。メンバーをプライベートにするということは、オブジェクトの外部からメンバーにアクセスするための通常のコードを記述できないことを意味します。

デバッガーはすべてを見ることができ、リフレクションを使用してコードからすべてにアクセスすることもできます。

于 2012-08-31T19:36:20.733 に答える
1

パスワードをコードに保存することはお勧めできません。コードを隠すのに最も近いのは、難読化です。それ以外の場合は、コンパイルされたコードにアクセスできる人なら誰でも、無料の逆コンパイラーを実行してその値を取得できます。

これは、パスワードの保存に関するいくつかの良いリンクがあるSOの質問です。

于 2012-08-31T19:26:24.290 に答える
1

OOPで「private」とマークされたフィールドは、「privatecorespondence」のように「private」を意味するものではありません。これはオブジェクト指向設計の概念であり、フィールドの変更をどこから期待するかをプログラマーに指示します(内部クラスコードからのみ)。

この目的でSecureStringを使用することを検討してください:http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx。ただし、コードを逆コンパイルから安全にするわけではありません。

于 2012-08-31T19:31:30.340 に答える
0

コードに保存した場合、その情報に誰もがアクセスできないようにすることは(おそらく)不可能です。

難しくしたり、ジャンプするフープを追加したりできますが、結局のところ、ユーザーに提供する実行可能ファイルにすべてを含めると、それらが制御されます。彼らはあなたがそこに隠したどんな情報にもアクセスすることができます。

逆コンパイルを妨げないようにコードを難読化すると、コードが難しくなります。プロジェクトの完全なリエンジニアリングは非現実的ですが、そこに埋め込まれているパスワードを見つけることは依然として非常に実用的です。

パスワードを暗号化することはできますが、実行可能ファイル自体が、パスワードを使用するためにパスワードを復号化するためのすべてを備えている必要があるという問題があります。ユーザーは、パスワードを復号化した後でメモリから取得するか、暗号化されたパスワードと暗号化キーの両方を取り出して自分で復号化することができます。

ユーザーが情報にアクセスできないことが重要な場合は、どのような状況でも、ユーザーに提供するプログラムのコードにその情報を含めることはできません。

ソース

于 2012-08-31T19:28:43.290 に答える
0

プライベート文字列のパスワードの値はデバッガーで確認できますが、ウォッチウィンドウにプライベートメンバーとして表示されているに違いありません。確認するには、次の方法でアクセスしてみてください。

ValueGetter vg = new ValueGetter();
String decryptedValue = vg.getValue("xfr3sf342d#2");
string password = vg.password; //won't compile because password is private

パスワードが非公開であることを示すコンパイラエラーが発生します。

デバッグの目的でプライベートプロパティを表示すると便利なため、デバッガーで値を確認できます。

于 2012-08-31T20:54:52.327 に答える