这似乎是一个相当容易的问题,但我很难找到明确的答案。目前,我有一个公共类,在构造函数中我正在定义一个这样的变量:
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变量的任何信息。
答案 0 :(得分:2)
私有化不会让它变得不可见。
访问修饰符用于编译器,它决定了如何从代码中访问内容。将成员设为私有意味着您无法编写常规代码来从对象外部访问它。
调试器可以看到所有内容,您也可以使用反射来访问代码中的所有内容。
答案 1 :(得分:1)
在代码中存储密码是个坏主意。你可以隐藏代码的最接近的是通过混淆。否则,任何有权访问已编译代码的人都可以运行任何免费的反编译器并获得该值。
Here is a SO question that has some good links on storing passwords
答案 2 :(得分:1)
OOP中标记为“私有”的字段并不像“私人对应”中那样“私有”。这是面向对象的设计概念,它告诉程序员从何处预期任何字段更改(仅来自内部类代码)。
考虑将SecureString用于此目的:http://msdn.microsoft.com/en-us/library/system.security.securestring.aspx。但是,它不会使您的代码免于反编译。
答案 3 :(得分:0)
如果您将其存储在代码中,则(可证明)您无法阻止任何人访问该信息。
你可以让它变得更难,你可以为他们添加越来越多的箍,但是如果你把所有东西都包含在你给用户的可执行文件中,那么他们就是那个控制者;他们可以访问您隐藏在那里的任何信息。
如果你对代码进行模糊处理,你就不会阻止它被反编译,你只需要更难。它使项目的完全重新设计变得不切实际,但找到埋在那里的密码仍然很实用。
您可以加密密码,但问题是可执行文件本身需要拥有解密密码才能使用的所有内容。用户可以在解密后从内存中获取密码,或者只需拔出加密密码和加密密钥并自行解密。
如果用户无法访问这些信息很重要,那么您根本无法将其包含在您在任何情况下提供的程序代码中。
答案 4 :(得分:0)
虽然你可以通过调试器看到私有字符串密码的值,但我敢打赌它在监视窗口中列为私有成员。要确认,请尝试按以下方式访问它:
ValueGetter vg = new ValueGetter();
String decryptedValue = vg.getValue("xfr3sf342d#2");
string password = vg.password; //won't compile because password is private
您将收到编译错误,指出密码是私有的。
调试器将允许您查看该值,因为查看私有属性以进行调试非常有用。