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

Java中的密码安全-将char[]转换为String

韦安怡
2023-03-14

我正在尝试为一个网站构建一个非官方的api。它将要求用户登录,密码将使用标准的Console.readPassword()方法从控制台读取。现在,这给了我一个char数组,但是我必须使用Apache的HttpClient库中的HttpPost类通过POST请求发送密码。为此,需要一个字符串,但是将密码转换为字符串会产生安全风险。我能做什么?

编辑:我知道如何将字符数组转换为字符串。问题是String是不可变的,因为您不能在Java中显式删除对象,所以密码将留在内存中。

共有3个答案

凌俊语
2023-03-14

我的建议是在客户端对输入用户的密码进行哈希处理,并将哈希发送到服务器,因为在服务器端存储纯文本密码首先是一种安全风险。此答案列出了在java中散列密码的整个方法,然后在用户登录时使用存储在服务器上的散列对密码进行身份验证。

顾宏朗
2023-03-14

如果您的意思是要在HTTP“Basic”身份验证中使用密码,那么从5.0版开始,Apace HTTP的UsernamePasswordCreentals支持传递char[]

如果您的意思是想在HttpPost的主体中传递密码,也就是说它必须在 Http实体HttbEntity内, HttpEntity是一个接口,理论上您可以根据需要实现 ,包括始终将密码作为字符数组保存。不过,编码时要小心,因为将 char[]转换为 byte[]而不会有人泄漏它的副本是很重要的。

卢黎明
2023-03-14

为了防止堆检查,安全人员会用语言告诉您奇妙的安全字符串概念。

我曾经是这个的信徒,现在不再是了。值得注意的是,.Net的等效产品SecureString正在逐步淘汰 - 您只需要观看大约10分钟的精彩youtube视频即可了解原因。这个概念听起来很棒,直到你必须对数据做一些事情,然后很可能你不能再保持它的安全(就像你的情况一样 - 你需要使用Apache库)。此外,在许多平台上,加密字符串的密钥与字符串本身位于相同的内存空间中,因此它确实比安全性更具混淆性。另请参阅安全堆栈交换讨论。

底线:这是语言中的一个固有问题,你没有太多的办法来保护它。

 类似资料:
  • 问题内容: 有没有办法将a 变成a 或将一个字母变成a (例如如何将a 变成a 和a 变成an )?(如果可以,请链接到相关文档)。 我该如何找到在文档中才隐约知道的类似内容? 问题答案: 您可以通过确定可能涉及的类来查找文档。在这里,候选人是和。 您应该先熟悉以下内容: 原始包装 中的Java Collection框架 它还有助于通过教程更慢地介绍API。 处理字符串中的字符

  • 问题内容: 将a转换为a 的最直接和/或最有效的方法是什么? 问题答案: 没有副本: 但是,该方法可能更容易编写,更容易阅读和更快。

  • 问题内容: 下面是一个代码片段, 但是我得到的是空输出。 我将得到1作为输出。 有人可以解释吗?如果我想像第一个代码片段一样将int转换为char,该怎么办? 问题答案: 会打印出ascii值为1的字符(首字符,这是不可打印的)。 将以ascii值49输出一个字符(一个对应于“ 1”) 如果要转换数字(0-9),则可以将数字加48并进行转换,例如;。 如果要转换 as asi的ascii值,可以使

  • 下面是一段代码片段, 但我得到的是空输出。 我将得到1作为输出。 有人能解释一下吗?如果我想像第一个代码片段那样将int转换成char,我应该怎么做?

  • 问题内容: 我正在编写一个基本程序,要求用户输入String,并且我尝试使用Robot(来自),它会在延迟后将该消息键入另一个文档。我现在遇到的问题是,我需要将得到的所有内容都转换为KeyCode。有没有更好的方法可以做我想做的事情?我想我总是可以有一个巨大的switch语句来获取适当的KeyCode,但是我希望会有一种更优雅的方法。我做Python一段时间后的第一个想法是制作一个字符串并将其以某

  • 问题内容: 我一直在尝试将用于在Java中加密的代码转换为ruby,但是我无法完全做到这一点。我得到了不同的价值观。 谁能让我知道,如何在红宝石中做到这一点。 问题答案: 加密代码: 解密代码: hex_to_bin和bin_to_hex 在我的情况下,Java代码使用默认的初始化向量,因此我没有设置任何iv,此外,那里缺少一块。因此,此后,所有程序都开始正常工作。 希望有人遇到此问题对您有所帮助