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 question,其中有一些关于存储密码的好链接

于 2012-08-31T19:26:24.290 回答
1

OOP 中标记为“private”的字段并不意味着“private”,就像“private corespondence”中那样。这是面向对象的设计概念,它告诉程序员从哪里可以预期任何字段更改(仅来自内部类代码)。

考虑为此目的使用 SecureString:http: //msdn.microsoft.com/en-us/library/system.security.securestring.aspx。但是,它不会使您的代码免受反编译。

于 2012-08-31T19:31:30.340 回答
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 回答
0

如果您将信息存储在代码中,则(可证明)您无法阻止任何人访问该信息。

您可以让它变得更难,您可以添加越来越多的箍让他们跳过,但归根结底,如果您将所有内容包含在您提供给用户的可执行文件中,那么他们就是控制者;他们可以访问您隐藏在其中的任何信息。

如果你混淆了代码,你不会阻止它被反编译,你只会让它变得更难。它使项目的完全重新设计变得不切实际,但找到埋在其中的密码仍然很实用。

您可以加密密码,但问题是可执行文件本身需要具备解密密码才能使用的所有内容。用户可以在您解密后从内存中获取密码,或者只需提取加密密码和加密密钥并自行解密。

如果用户无法访问该信息很重要,那么您根本无法将其包含在您在任何情况下提供给他们的程序代码中。

资源

于 2012-08-31T19:28:43.290 回答