我在我的程序(用Java编写)中有一个变量:
String myPassword
Run Code Online (Sandbox Code Playgroud)
在使用Android Studio编译代码后,我得到了一个Android应用程序,我想让其他人使用它.
但我很害怕:用户是否有可能从应用程序中获取变量值(密码)?
假设密码值为"myPass".它的二进制是:
01101101 01111001 01010000 01100001 01110011 01110011
应用程序二进制文件中是否包含此序列?
我将普通密码作为字符串存储在内存中时出现问题.根据该参考文献,由于字符串是不可变的,因此存在使用字符串数据类型存储在内存中的敏感数据的漏洞.
https://www.geeksforgeeks.org/use-char-array-string-storing-passwords-java/
我可以通过使字符串变量无效而不是使用char数组或字符串缓冲区/构建器来克服此安全问题.
例如:String password ="password"; password = null;
我正在开发一个我想要添加SSL的项目,所以我创建了一个简单的客户端/服务器测试实现,看看它是否有效,我得到一个NoSuchAlgorithmException.以下是我抛出异常的服务器代码:
import java.io.*;
import java.net.*;
import java.security.KeyManagementException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import javax.net.ssl.*;
public class SslServer
{
private static final int PORT = 5555;
public static void main(String[] args)
{
SecureRandom sr = new SecureRandom();
sr.nextInt();
try {
//client.public is the keystore file that holds the client's public key (created with keytool)
KeyStore clientKeyStore = KeyStore.getInstance("JKS");
clientKeyStore.load(new FileInputStream("client.public"), "clientpublicpw".toCharArray());
//server.private is the key pair for the server (created with keytool)
KeyStore serverKeyStore …Run Code Online (Sandbox Code Playgroud) 如何使用JOption窗格的showInputDialog隐藏字符.例如:JOptionPane.showInputDialog("输入您的姓名:").
我想在用户提供他的名字时隐藏字符.我正处于申请中间.如果我可以隐藏这些角色,我的工作就完成了.我不想使用JPasswordField,因为它需要一个表单来保存该标签(JPasswordField).
字符串容易受到密码值的影响.我注意到Vaadin PasswordField操纵密码为String.
以下是默认构造函数PasswordField,
public PasswordField() {
setValue("");
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
PasswordField在Vaadin 使用是否安全?根据上述问题的答案,我理解的是创建一个String包含密码的对象是一种安全威胁,因为它可能会在内存中保留一段时间而且是不可变的.
所以我想知道,
检索一直挂在内存中的东西,没有引用或遗漏垃圾收集是多么容易?
你是怎么做到的?
编辑
由于问题已经结束,请善意通过添加评论来分享您的知识,如果您认为将来可能会得到有趣的答案,请考虑重新打开问题.:)
我JPasswordField在我的程序中使用了一个.当我问getPassword(),我得到一个char[]数组.但是,当我添加ActionListener的JPasswordField,问getActionCommand(),我得到的密码作为String.此密码是否在事件对象中保存为String?这不是一个安全问题吗?
我阅读了几篇关于安全性的文章和帖子(注意 在Web应用程序中将输入密码与存储的哈希密码进行比较,或者为什么char []首选字符串用于密码?
由于从请求中检索参数值使用返回String的request.getParameter("passwordFieldName"),是否有任何选项可以从请求中检索参数作为char []?
我一直在尝试检测源代码文件中的硬编码密码.
目前,我正在检查变量赋值和比较标识符,其子字符串与password,pswd匹配.
但它导致了许多误报,例如在这种情况下(从配置文件中读取密码)
String PASSWORD_KEY = "server.password";
String password = prop.getProperty(PASSWORD_KEY);
Run Code Online (Sandbox Code Playgroud)
我可以标出一些子字符串,如Key,location,path,我可以跳过错误生成但除此之外,我想不出更好的方法.
所有建议表示赞赏.
我们已经知道使用这个建议/做法char[]而不是String敏感数据.这有多种原因.一种是在不再需要敏感数据后立即清理它们:
char[] passwd = passwordProvider.getKeyStorePassword();
KeyStore keystore = KeyStore.getInstance("JKS");
// TODO: Create the input stream;
keystore.load(inputstream, passwd);
System.arraycopy(new char[passwd.length], 0, passwd, 0, passwd.length);
// Please continue...
Run Code Online (Sandbox Code Playgroud)
现在的问题是:char[]当敏感数据最初作为String价值出现时,它(即使用)是否有意义(特别是上面提到的那一点)?例如:
char[] passwd = passwordProvider.getKeyStorePassword().toCharArray();
KeyStore keystore = KeyStore.getInstance("JKS");
// TODO: using the passwd, load the keystore;
System.arraycopy(new char[passwd.length], 0, passwd, 0, passwd.length);
// Please continue...
Run Code Online (Sandbox Code Playgroud)
提前致谢.
更新2:我将重新解释这个问题:在这个特定的环境中(忘记将来或其他任何事情的变化),清除"char数组的内容"这一行是否有用?
UPDATE1:它不是重复的为什么char []首选字符串的密码? 我知道故事是什么.我在这个特定的背景下问,它还有意义吗?