2012-08-31 56 views
0

這似乎是一個相當簡單的問題,但我很難找到一個明確的答案。目前,我有一個公共類,並在構造函數中,我定義這樣一個變量:隱藏變量在視覺c#公共類

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變量的信息。

+5

不要在代碼中存儲密碼。 –

+0

密碼是私有的,因此只在ValueGetter內部可見。您只能看到調試器的密碼值,因爲調試器允許您查看私有成員。嘗試從表單中引用ValueGetter.password,您將看到它無法訪問。 – Maciej

+0

@Maciej它仍然不以任何方式阻止從惡意用戶訪問它。你可以通過反射訪問它,反編譯代碼,傾銷和檢查內存等。 – Servy

回答

0

雖然你可以通過調試器看到私人字符串密碼的值,但我敢打賭它作爲私人成員在監視窗口中列出。要確認,請嘗試按以下方式訪問它:

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

您將收到一個編譯器錯誤,指出密碼是私人的。

調試器會讓您看到該值,因爲它用於查看用於調試目的的私有屬性。

+0

謝謝,很高興知道!感謝大家的回覆。給我很多想法! – user1420914

0

這是(可證明),你們不能阻止任何人訪問這些信息,如果你將其存儲在代碼。

你可以使它更難,你可以添加更多的籃球爲他們跳通過,但在這一天結束時,如果你是包括一切都在一個可執行文件,你給用戶,然後他們是一個在控制之中;他們可以訪問您隱藏在那裏的任何信息。

如果你混淆了代碼,你不會阻止它被反編譯,你只是讓它更難。它使得項目的重新設計變得不切實際,但找到一個埋在其中的密碼仍然非常實用。

您可以對密碼進行加密,但問題是可執行文件本身需要將所有密碼解密以供其使用。用戶可以在解密後從內存中獲取密碼,或者只需提取加密密碼和加密密鑰並自行解密。

如果用戶無法訪問這些信息非常重要,那麼您無法將其包含在任何情況下爲您提供的程序的代碼中。

Source

1

場標誌着OOP 「私有」 並不意味着 「私人」,如 「私人corespondence」。這是面向對象的設計概念,它告訴程序員從哪裏期望任何字段更改(僅來自內部類代碼)。

考慮將SecureString用於此目的:http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx。但是,它不會使您的代碼安全無法反編譯。

2

製造一些私人物品並不會讓它看不見。

訪問修飾符用於編譯器,它決定了如何從代碼訪問事物。將成員設爲私有意味着您不能編寫常規代碼從對象外部訪問它。

調試器可以看到一切,也可以使用反射來訪問代碼中的所有內容。