&引用;“无效”;ruby中的一个变量

&引用;“无效”;ruby中的一个变量,ruby,Ruby,我有一个用例,出于安全原因,当我不再需要某些数据时,我需要处置它 我正在用Ruby编写一个服务器,处理登录和密码。我使用BCrypt在数据库中存储密码。我的服务器收到密码,对其进行bcrypt哈希,然后不再使用原始密码 我知道有一种网络攻击涉及从RAM中盗取数据,我担心攻击者可能会在密码仍在内存中的时间段内盗取用户原始字符串形式的密码。我不确定仅仅使用password\u in\u string\u form=nil是否足够 我希望在使用完保存用户密码的变量后立即将其置零。我所说的nullify

我有一个用例,出于安全原因,当我不再需要某些数据时,我需要处置它

我正在用Ruby编写一个服务器,处理登录和密码。我使用BCrypt在数据库中存储密码。我的服务器收到密码,对其进行bcrypt哈希,然后不再使用原始密码

我知道有一种网络攻击涉及从RAM中盗取数据,我担心攻击者可能会在密码仍在内存中的时间段内盗取用户原始字符串形式的密码。我不确定仅仅使用
password\u in\u string\u form=nil是否足够


我希望在使用完保存用户密码的变量后立即将其置零。我所说的nullify是指类似于使用/dev/null用零填充的东西。最终目标是不可逆地破坏数据,这在Ruby中是不可能的

您必须为每个实现编写一些特定的代码(Opal、TruffleRuby、JRuby、Rubinius、MRuby、YARV等),以确保这一点。根据实现的不同,如果没有自己管理的单独内存块,甚至可能根本不可能在实现的托管内存中执行

也就是说,您可能需要有一小段本机代码来管理自己的一小段本机内存,并将其注入到您的Ruby程序中

我不确定仅仅使用
password\u in\u string\u form=nil是否足够

不,这还不够。对象可能会也可能不会立即被垃圾收集,即使是这样,也不会导致内容从内存中擦除

但是,除非它们已被冻结。因此,只要不冻结密码字符串,就可以在放开它之前用零、随机字符或其他任何字符替换它的内容。特别是,这应该是可行的,但有几个附带条件,将在后面介绍:

(0 ... password_in_string_form.length).each do |i|
    password_in_string_form[i] = ' '
end
但需要小心,因为这种方法可能看起来更像idomatic,但不起作用:

replace()
不会就地更新目标字符串的内容,而是将内容释放到Ruby的内部分配器(该分配器不会修改内容),并根据替换的细节为新内容选择策略

然而,这两种方法之间的效果差异对您来说应该是一个巨大的警告标志。Ruby是一种相当高级的语言。它为您提供了很大的杠杆作用,但代价是控制细节,例如数据是否保留在内存中以及保留多长时间

这就引出了但书。以下是主要的:

  • 在处理密码字符串时,必须注意避免复制密码字符串或其任何部分,或者捕获所有副本并将其丢弃。这将需要一些纪律和注意细节,因为制作这样的副本非常容易

  • 破坏密码字符串本身可能不足以实现您的目标。您还需要在内存中丢弃任何其他密码副本,例如从隔离密码字符串的上游。例如,如果您的应用程序是web应用程序,那么它将包括向您的应用程序传递密码的HTTP请求的内容,以及可能从中派生的字符串,而不仅仅是单独的密码字符串。类似情况也适用于其他类型的应用程序

  • 密码可能不是你需要保护的唯一东西。如果对手可以从主机内存中窃取密码,那么他们也可以窃取用户登录后访问的敏感数据

出于这些和其他原因,如果服务器的安全要求要求用户密码的内存副本在不再需要时立即销毁,那么(纯)Ruby可能不是合适的实现语言


另一方面,如果对手获得足够的权限从内存/交换中刮取密码,那么游戏可能已经结束了。至少,他们可以访问应用程序可以访问的所有内容。这并不意味着密码完全没有意义,但您应该在评估对此问题投入了多少精力时考虑到这一点。

当某些内容超出范围时,您可以触发垃圾收集,低级内存管理不是Ruby的一项功能。我认为,如果有人能够以允许读取RAM中稀有内容的方式访问您的服务器,那么只需监听网络设备上的传入流量,对该人来说将更简单、更高效。这样一来,他们不仅可以获得刚注册用户的密码,还可以获得所有在收听时登录的用户的密码。@Spickerman:很久以来人们都是这么想的。然后幽灵和熔毁出现了。可怕的是,它们显示了整个行业对CPU设计中基本安全措施的根本忽视。特别是,这些攻击实际上并不新奇,其中一些攻击早在90年代初就已经被描述过了。它们存在于不同时代不同供应商(英特尔、AMD、IBM、Oracle、富士通、苹果、高通、Nvidia)的各种不同体系结构(IA-32、AMD64、ARM、POWER、MIPS、Sparc)的CPU(嵌入式、移动、笔记本、台式机、工作站、服务器、中端)中(例如,从1995年起的所有Intel x86和AMD64 CPU,除2013年之前的Atom外,所有IBM PowerPC G5、POWER6、POWER7、POWER8、POWER9和一些PowerPC G4等)。他们会定期寻找新的相关产品,例如SpectreNG、ret2spec、SpectresB、SgExpectre、NetSpectre,它们是Spectre攻击的扩展,或者是扰流板、辐射、僵尸负载、僵尸负载2等
# SURPRISE! This does not reliably remove the password from memory!
password_in_string_form.replace(' ' * password_in_string_form.length)