Java 为了安全起见,将新字符串(char[])作为密码参数传递给只接受字符串作为参数的方法是否安全?
我已经读过,对于密码,使用Java 为了安全起见,将新字符串(char[])作为密码参数传递给只接受字符串作为参数的方法是否安全?,java,string,security,passwords,Java,String,Security,Passwords,我已经读过,对于密码,使用char[]更为理想,因为string是不可变的。 问题是,我需要将密码参数传递给调用http调用的第三方依赖项。它只接受字符串。调用涉及在消息中发送密码,因此我使用以下方法: new Request.Builder() .url("notmyapi.com/login") .method("POST", new FormBody.Builder() .add("name", username) .add("passwor
char[]
更为理想,因为string
是不可变的。
问题是,我需要将密码参数传递给调用http调用的第三方依赖项。它只接受字符串。调用涉及在消息中发送密码,因此我使用以下方法:
new Request.Builder()
.url("notmyapi.com/login")
.method("POST", new FormBody.Builder()
.add("name", username)
.add("password", password)
.build())
.build()
我知道web api只是接受一个密码,而不是接受base64版本或其他版本,这可能很糟糕,但这不是我的,我只需要完成我的工作
问题:
由于我现在将密码作为char[]
传递,但是上面的.add(key,value)
方法只接受一个字符串,所以执行.add(“password”,new string(password))
是否安全?这不会在内存中创建一个新的字符串实例吗?出于安全考虑,我应该尽量避免这样做
我已经读过,对于密码,使用char[]
更为理想,因为string
是不可变的
这不是全部原因。实际理由是:
字符串,因为它是不可变的
- 密码将在
中清除一段时间char[]
- 在密码到达您的代码之前,它们很可能已经被servlet堆栈(或您使用的任何框架)转换为
对象李>String
- 此外,只有覆盖代码中的
时,此缓解措施才有效char[]
字符串
对象进行变异。总的来说,这是一件危险的事情。对于密码/密码检查,这可能是可以接受的char[]
而不是String
在Java中实现成本太高。。。。除非您准备完全重新设计您的web框架。此外,考虑到具有深度访问权限的人可以通过其他方式窃取密码,这样做的好处还有争议
现在谈谈你的具体问题: 添加(“密码”,新字符串(密码))
如果您认为使用<代码>字符串对于密码是有风险的,那么该代码不起作用。事实上,假设
password
是一个String
,那么现在内存中有两个String
对象包含密码文本
- 如果您使用的API要求您将密码作为
字符串提供,则您有问题
- 如果密码的来源(即如何从用户界面、servlet框架等获取密码)是
字符串,那么您就有问题了
- 在这两种情况下,都需要对与之交互的代码的各个方面进行返工以解决问题。这可能很困难
Base64不会让坏人慢下来超过一分钟左右。任何可逆编码也是如此。但我希望您坚持密码只能通过SSL/TLS安全连接发送。无论您如何尝试客户端,它都与安全无关,因为它似乎是一个简单的http客户端,具体取决于您在文章中的代码。因此,它将基于http协议发出一个简单的http请求。因此,您的密码将以明文形式出现在http post请求的正文中,类似于
username=john&password=12345
我想你在客户端没有什么事可做,这里唯一的工作就是如果web api有一个启用ssl的安全端点,那么你就可以使用它
如果坏人可以读取JVM内存或页面文件,它们就深入到你的基础设施中
实际上它是一个桌面客户端(任何人都可以下载)通过http调用web api对用户进行身份验证<代码>如果您使用的API要求您以字符串形式传递密码,那么您就有问题了。好吧,废话Base64不会让坏人慢下来超过一分钟左右。
是的,我想,我知道的不多,所以我就把我能提到的东西放进去了。。。好吧谢谢因此,最佳的解决方案是让web api不接受密码作为普通字符串,对吗?如果您在用户桌面上输入密码时依赖密码安全性,那么您更大的问题是,坏人可能构成了用户的密码