我的应用程序在其GUI上显示IP地址和密码。密码会定期更改(对于每个连接到它的新人),并且只能由连接人员使用一次,以确保他们连接到正确的设备。例如,彼此相邻的两个朋友想要使用我的应用程序,查看服务器的密码以确保他们不会意外地使用附近的应用程序连接到另一个人。
用户还可以与另一台设备“配对”,在这种情况下,系统会要求他们输入一次密码,要求服务器用户确认配对过程,然后再不再需要密码。我这样做是通过在数据库中保留一个新的随机生成的密码和另一个用户的MAC地址。
目前,我使用String
来存储和比较我的应用中的所有密码。我已经读过,使用char
数组来存储密码对安全性更好,因为您不必担心实习池将密码保存在内存中。
对于我的用例,我真的需要担心这种安全吗?我没有处理任何用户敏感信息,我只是喜欢安全网。
附带问题,如何在Swing GUI上的char
数组中显示密码而不将其转换为String
?
答案 0 :(得分:1)
恕我直言,使用char数组只会给你一种更好的安全感。如果某人对您的计算机及其内存具有物理访问权限,则使用String或char数组不会产生巨大差异。
回答你问的问题。问题不在于实习字符串池,因为您不会实际生成随机生成的字符串。问题是STrings是不可变的,因此保存在内存中直到垃圾收集而没有任何(理智的)重置其内容的方式。 char数组的所有元素在不再需要之后可以重置为0。
关于在不将其转换为String的情况下显示密码的方法,您可以直接在JComponent上绘制每个char,例如。但是如果你准备在屏幕上显示密码,那么考虑将密码留在内存中隐藏的地方对我来说是相当矛盾的。
答案 1 :(得分:1)
安全的主要目的是避免权利升级。基本上每个进程都有一些允许他们做的事情,你需要确保有权访问一个资源的人不能使用它来获取对另一个资源的访问权。
在您的情况下,主要问题是“通过访问密码会使程序获得什么?”。如果主应用程序已经显示了所有相关信息,那么流氓进程(可访问您的内存空间)是否可以通过嗅出密码获得任何收益?
如果您正在使用在线流程,答案可能是肯定的。掌握一个人说Dropbox密码有价值,即使我已经拥有对本地机器的广泛访问权限。但是,如果您正在谈论本地应用程序,他们可能通过嗅出密码几乎没有收获。