- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我读过关于密码,使用 char[]
更为理想,因为 Strings
是不可变的。问题是,我需要将密码参数传递给调用 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))
?这会不会在内存中创建一个新的 String 实例,我应该出于安全考虑而试图避免这种情况?
最佳答案
I've read that for passwords, it's more ideal to use
char[]
sinceStrings
are immutable.
这不是(全部)原因。实际推理是:
您正在使用密码来保证安全。
坏人可能能够获取正在运行的 JVM 的内存转储……或者从保存(或保存)JVM 内存页的磁盘 block 中提取部分转储。该转储可能包含明文密码。
为了缓解这种情况,可以(应该)在不再需要密码时覆盖包含密码的内存。
很难覆盖 String
,因为它是不可变的。
但如果您检查其中的每一点,就会发现一些假设可能会受到质疑。
密码不是实现安全性的好方法。对于高级安全性,您应该使用公钥/私钥或 key 身份验证。因此,要么您正在谈论对您的系统“不太重要”的密码……要么您遇到的问题比您在此处尝试解决的问题更大。
如果坏人可以读取 JVM 内存或页面文件,那么他们已经深入到您的基础设施中了。你已经致命地妥协了。此外,如果他们陷得这么深,他们很可能会找到其他方法来窃取密码;例如窃取您的 SSL 证书的私钥并窥探/解码加密的网络流量。
这只是一种缓解措施:
char[]
中以明文形式保存一段时间。String
对象。char[]
的内容时,此缓解措施才有效。其实如果你真的很担心这个,用反射来删除一个String是可以的;即改变一个 String
对象。一般来说,这是一件危险的事情。对于密码/密码检查,这可能是可以接受的。
简而言之,我认为使用 char[]
而不是 String
在 Java 中实现太昂贵了....除非你准备好完全重新 -设计您的 Web 框架。此外,鉴于具有深度访问权限的人可以通过其他方式窃取密码,这样做的好处值得商榷。
现在回答您的具体问题:
Is it safe to do
.add("password", new String(password))
如果您认为使用 String
作为密码存在风险,那么该代码就无济于事了。事实上,假设 password
是一个 String
,您现在在内存中有两个包含密码文本的 String
对象。
如果您使用的 API 要求您以 String
形式提供密码,那么您就有问题了。
如果密码的来源(即您如何从用户界面、servlet 框架等获取密码)是一个String
,那么您就有问题了。
这两种情况都需要重新设计与您交互的代码的各个方面以解决问题。这可能很困难。
和:
I know it's probably bad that the web api is just accepting a password as it is instead of accepting a base64 version or whatever.
Base64 不会让坏人慢下来超过一分钟左右。任何可逆编码均是如此。但我希望您坚持只能通过 SSL/TLS 安全连接发送密码。
关于java - 为了安全起见,将 new String(char[]) 作为密码参数传递给只接受字符串作为参数的方法是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175287/
Internal Server Error: /admin/account/customuser/add/ Traceback (most recent call last): File "C:\
有问题!虽然我发现几乎相似的线程但没有帮助:( 我编写了一个 php 脚本来从我的 MySQL 数据库中获取注册用户的数量。该脚本在我的本地主机上运行良好;它使用给定的用户名、密码和主机名,分别是“r
我正在做一项基于密码的作业,我将 key 和消息放在单独的数组中。我想创建第三个数组,其中包含围绕消息大小的 key ,如下所示: message keykeyk 我已经在这个问题上苦苦挣扎了一段时间
我的几个客户要求我实现图形密码检查器,例如 关于如何实现这种 UI 有什么想法吗? 最佳答案 试着看看这个:https://code.google.com/p/android-lockpattern/
我正在使用 MAMP,每次登录 phpMyAdmin 时,都会收到以下错误/警告消息: the configuration file now needs a secret passphrase (bl
我正在尝试通过将 Visual Studio 2013 连接到我的测试机来调试 WDF 驱动程序。它创建一个名为 WDKRemoteUser 的用户,并在进行测试时尝试自动登录。有人知道这个用户的密码
使用具有指定用户名和密码的 SVN 提交。我希望服务器抛出错误;所以我可以告诉我的用户他/她的密码错误。 相反,在使用错误密码提交后: svn commit "test_file.txt" --use
我正在尝试实现 friend 推荐。 它从节点“你”开始。而且,我想找到节点“安娜”。 换句话说,这是我的两个或更多 friend 共同认识的人。上面的示例节点是 Anna。 如果您的帮助,我将不胜感
我都尝试过 wget --user=myuser --password=mypassword myfile 和 wget --ftp-user=myuser --ftp-password=mypass
我的一位用户提示说,每当他尝试使用默认管理界面(Django 的管理员)添加新用户(auth.User)时,新用户名和密码都会自动填充他自己的。 问题是他在登录时要求 Firefox 记住他的用户名/
我们正在开发一款应用(当然)用于应用购买 (IAP)。我已完成指南中的所有操作以启用 iap,并且一切正常,直到我想要购买为止。 部分代码: MainViewController.m -(vo
我试图创建两个可选匹配项的并集(如下所示),但我得到的不是并集,而是两者的交集。我应该如何更改此查询以获得所需的联合? optional match (a:PA)-[r2:network*2]-(b:
我想将Ansible用作另一个Python软件的一部分。在该软件中,我有一个包含其用户名/密码的主机列表。 有没有一种方法可以将SSH连接的用户/密码传递给Ansible ad-hoc命令或以加密方式
嗨,我在使用xampp的Apache Web服务器上收到错误500。直到我使用.htaccess,.htpasswd文件,错误才出现。我搜索了,但找不到语法错误。我只有1张图片和要保护的索引文件。以下
我一直使用它来编辑用户帐户信息: $this->validate($request, [ 'password' => 'min:6', 'password_confirmation'
我需要使用InstallUtil来安装C# Windows服务。我需要设置服务登录凭据(用户名和密码)。这一切都需要默默地完成。 有没有办法做这样的事情: installutil.exe myserv
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
如果我有一个随机的、16 个字符长的字母数字盐(不同大小写),它是为每个用户生成和存储的,我是否还需要一个站点范围的盐? 换句话说,这样好吗? sha1($user_salt . $password)
我正在开发一个空白程序,该程序将允许用户创建一个帐户,以便他们可以存储其余额和提款/存款。用户输入用户名和密码后,如何存储这些信息以便用户可以登录并查看其余额?我不一定要尝试使其非常安全,我只是希望能
我正在尝试寻找一种通用方法来搜索没有链接到另一个节点或节点集的节点或节点集。例如,我能够找到特定类型(例如 :Style)的所有节点,这些节点以某种方式连接到一组特定的节点(例如 :MetadataR
我是一名优秀的程序员,十分优秀!