当前位置: 首页 > 知识库问答 >
问题:

使用Apache HTTP客户端而不将凭据作为字符串传递?

芮叶秋
2023-03-14

在对我们的Swing应用程序进行审计后,我们的用户的某些密码似乎在他们登录甚至退出后很长时间仍保留在内存中。

原因之一似乎是Apache HttpClient的< code > UsernamePasswordCredentials 将密码存储为< code >最终字符串,防止以编程方式将其从内存中擦除(参见为什么char[]比String更适合用作密码?).

但是,由于它实现的< code>Credentials接口有一个< code>String getPassword()方法,因此在某些时候似乎不可能避免转换为< code>String。

在这种情况下,有没有其他方法可以避免将密码作为String传递?

我们正在使用HttpClient 4.0.3,但在最近的版本中似乎没有改变。

共有2个答案

夏侯玄天
2023-03-14

最后,我实施了Edd在他的答案的评论中提出的解决方法。

char[] password = …
final Credentials credentials = new UsernamePasswordCredentials(username, null) {
    @Override
    public String getPassword() {
        // AKCTAT-3791: this helps the GC to clear the String from the memory, as it will be used and dismissed immediately
        // Unfortunately Apache HTTP Client does not allow to pass the byte[] directly
        return new String(password);
    }
};
httpClient.getCredentialsProvider().setCredentials(ANY_AUTHSCOPE, (Credentials) auth.getCredentials());
// ... (do stuff with httpClient)
Arrays.fill(password, '\0');

看起来GC很快就把它从内存中删除了,但是这仍然只是一个没有保证的解决方法。

华知
2023-03-14

Apache说,使用密码字符串初始化用户名密码证书已被弃用

用户名密码证书(String用户名密码)
已弃用。
(4.5)将在5.0中替换为String, char[]

UsernamePasswordCredentials(String userName,String password)
带有用户名和密码参数的构造函数。

https://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/org/apache/http/auth/UsernamePasswordCredentials.html

您使用的是最新版本的库吗?如果是这样,他们不会将密码存储为String,而是存储为char[]。

 类似资料:
  • 问题内容: Apache Commons和JSch都需要私钥文件来建立SFTP连接。我正在处理的项目将用于连接到多个SFTP服务器。因此,我们不希望部署多个私钥文件,而是将这些密钥作为字符串保留在加密的配置文件中。是否有一个不需要文件对象作为私钥的SFTP库? 问题答案: JSch有一个addIdentity方法重载,它从缓冲区中获取密钥: 有关实现的示例,请参见JSch:来自存储在hdfs上的私

  • 当授权范围限于客户端控制下的受保护资源或事先与授权服务器商定的受保护资源时客户端凭据可以被用作为一种授权许可。典型的当客户端代表自己表演(客户端也是资源所有者)或者基于与授权服务器事先商定的授权请求对受保护资源的访问权限时,客户端凭据被用作为授权许可。

  • 有人用这种方法吗?https://laravel.com/docs/5.4/passport#client-凭证授予代币 我试图使注册API只包含client_id和client_secret,我希望返回作为访问令牌、刷新令牌、过期日期,但返回www.url。com/oauth/token这是什么 有人能帮我吗?提前谢谢

  • 当客户端是资源所有者时,或者当授权范围限于受客户端控制的受保护资源时,客户端凭证可以用作授权授权。 客户端仅在客户端凭据的帮助下请求访问令牌。 客户端凭证授权流用于获取访问令牌以授权API请求。 使用客户端凭据授权,获取的访问令牌仅授予客户端应用程序搜索和获取目录文档的权限。 下图描绘了客户端凭据流。 上图所示的流程包括以下步骤 - Step 1 - 客户端使用授权服务器进行身份验证,并从令牌端点

  • 我读了很多文章来寻找java应用程序的最佳Rest客户机,最后我发现将Jersey与ApacheHTTP客户机4.5结合使用非常好,但在很多文章中,我发现现在改型是最好的(我没有提到Volley,因为在我的例子中,我不需要API支持缓存)。 对于java客户机应用程序,改型是否更好。还是对Android来说更好?为什么我以前没有找到这个比较。。它们无法比较? 我可以比较一下它们的性能、连接池、它们

  • 顺便说一句,这些微服务只会通过中间件层互相交谈,我的意思是不需要用户凭据来允许授权(用户登录过程如Facebook)。 我在Internet上寻找了一些示例,展示了如何创建一个授权和资源服务器来管理这种通信。然而,我只是找到了一些例子,解释了如何使用用户凭据(三条腿)来实现它。 有没有人有在Spring Boot和Oauth2中如何做的样例?如果有可能提供更多关于所用范围的详细信息,令牌交换将不胜