Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/336.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为了安全起见,将新字符串(char[])作为密码参数传递给只接受字符串作为参数的方法是否安全?_Java_String_Security_Passwords - Fatal编程技术网

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
是不可变的

这不是全部原因。实际理由是:

  • 您正在使用密码进行安全保护

  • 一个坏人可能会得到一个正在运行的JVM的内存转储。。。或者从保存(或保存)JVM内存页的磁盘块中提取部分转储。该转储可能包含明文形式的密码

  • 为了缓解这种情况,当不再需要密码时,可以(应该)覆盖包含密码的内存

  • 很难覆盖
    字符串,因为它是不可变的

  • 但如果你仔细研究其中的每一点,就有一些假设是可以质疑的

  • 密码不是实现安全性的好方法。对于高级安全性,您应该使用公钥/私钥或密钥身份验证。所以,要么你说的密码对你的系统“不那么重要”。。。或者你有一个比你要解决的问题更大的问题

  • 如果坏蛋可以读取JVM内存或页面文件,那么它们就会深入到您的基础架构中。你已经受到致命的伤害。此外,如果他们深陷其中,他们很可能会找到其他方法窃取密码;e、 g.窃取您的SSL证书私钥并窥探/解码加密的网络流量

  • 这只是一种缓解措施:

    • 密码将在
      char[]
      中清除一段时间
    • 在密码到达您的代码之前,它们很可能已经被servlet堆栈(或您使用的任何框架)转换为
      String
      对象
    • 此外,只有覆盖代码中的
      char[]
      时,此缓解措施才有效
  • 事实上,如果你真的担心这一点,可以使用反射来擦除字符串;i、 e.对
    字符串
    对象进行变异。总的来说,这是一件危险的事情。对于密码/密码检查,这可能是可以接受的

  • 简而言之,我认为使用
    char[]
    而不是
    String
    在Java中实现成本太高。。。。除非您准备完全重新设计您的web框架。此外,考虑到具有深度访问权限的人可以通过其他方式窃取密码,这样做的好处还有争议


    现在谈谈你的具体问题:

    添加(“密码”,新字符串(密码))

    如果您认为使用<代码>字符串对于密码是有风险的,那么该代码不起作用。事实上,假设

    password
    是一个
    String
    ,那么现在内存中有两个
    String
    对象包含密码文本

    • 如果您使用的API要求您将密码作为
      字符串提供,则您有问题

    • 如果密码的来源(即如何从用户界面、servlet框架等获取密码)是
      字符串,那么您就有问题了

    • 在这两种情况下,都需要对与之交互的代码的各个方面进行返工以解决问题。这可能很困难

    以及:

    我知道web api只是接受密码,而不是接受base64版本或其他版本,这可能是不好的


    Base64不会让坏人慢下来超过一分钟左右。任何可逆编码也是如此。但我希望您坚持密码只能通过SSL/TLS安全连接发送。

    无论您如何尝试客户端,它都与安全无关,因为它似乎是一个简单的http客户端,具体取决于您在文章中的代码。因此,它将基于http协议发出一个简单的http请求。因此,您的密码将以明文形式出现在http post请求的正文中,类似于
    username=john&password=12345


    我想你在客户端没有什么事可做,这里唯一的工作就是如果web api有一个启用ssl的安全端点,那么你就可以使用它

    如果坏人可以读取JVM内存或页面文件,它们就深入到你的基础设施中
    实际上它是一个桌面客户端(任何人都可以下载)通过http调用web api对用户进行身份验证<代码>如果您使用的API要求您以字符串形式传递密码,那么您就有问题了。
    好吧,废话
    Base64不会让坏人慢下来超过一分钟左右。
    是的,我想,我知道的不多,所以我就把我能提到的东西放进去了。。。好吧谢谢因此,最佳的解决方案是让web api不接受密码作为普通字符串,对吗?如果您在用户桌面上输入密码时依赖密码安全性,那么您更大的问题是,坏人可能构成了用户的密码