【问题标题】:Secure erasing of password from memory in Ruby在 Ruby 中安全地从内存中擦除密码
【发布时间】:2016-10-09 09:45:13
【问题描述】:

我正在编写一个需要处理用户企业密码的 Ruby 应用程序。我想尽量减少密码在内存中的时间,以减少密码被泄露的可能性。

在母语中,我会直接删除数据。在 C# 中,我会使用 SecureString class。在 Java 中,我会使用 char[]。但我可以为 Ruby 找到的最好的是 old feature request,它似乎已经死了。

在 Ruby 中安全存储和擦除内存中的密码的标准是什么?有没有这样的类?类似于Java的char[]的编码模式?

【问题讨论】:

  • 最终这是一个失败的原因,因为您无法控制哪些数据存储在 L1、L2、L3 高速缓存或寄存器本身中。那些认为他们可以将其从系统内存中删除的人通常是错误的,操作系统可能会在他们不知情的情况下重新映射内存并留下数据痕迹。如果您需要绝对安全,请使用不需要您的应用程序具有裸密码的身份验证机制。像 LDAP 或 Oauth 这样的机制完全卸载了这个责任。
  • @tadman 够公平的。我仍然有兴趣了解人们是否使用了常见的模式
  • 您可能想查看how people handle cryptographic private keys,这通常比密码问题严重得多。解决方案通常非常复杂且昂贵。基本上,如果您不能信任硬件的安全性,请不要信任您的硬件并避免首先接受密码。使用不同的身份验证机制。在内存中擦洗会限制您的风险,但并不能消除风险。
  • @tadman 关于键的好主意。我会研究那个。并不是我不信任硬件,我最关心的是核心转储或以明文形式将密码存储在文件系统中的东西。我当然明白仍然存在潜在的泄漏(例如:不能确定密码没有留在用于交换的磁盘上)。但是,如果我只需付出一点额外的努力就能更安全,那可能是值得的
  • 如果您对此感到担忧,我会在您可以得到专家关注的地方提出来,也许可以制作一个宝石来满足这些需求。这听起来像是一项需要做正确的工程任务,而任何事情如果不把它钉牢,听起来就像是一种偏执狂,收获甚微。

标签: ruby passwords erase


【解决方案1】:

关于从内存中安全擦除秘密的红宝石问题存在 5 年了 (5741)。该问题还包含一些链接,这些链接解释了为什么从内存中删除密码是一件好事。最近MacOs 确实遇到了 FileVault2 的问题,因为密码存储在内存中。

问题 5741 中显示的一种可能的解决方案是:

pass = ""
$stdin.sysread(256, pass) # assuming a line-buffered terminal
io = StringIO.new("\0" * pass.bytesize)
io.read(pass.bytesize, pass)

它似乎适用于 ruby​​ 2.3.1p112,但我不能保证。

【讨论】:

    猜你喜欢
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-06-22
    • 1970-01-01
    • 1970-01-01
    • 2017-03-23
    • 2013-12-25
    相关资源
    最近更新 更多