【问题标题】:how to protect plain text password in my script? (ruby)如何保护我的脚本中的纯文本密码? (红宝石)
【发布时间】:2011-01-16 16:14:43
【问题描述】:

在我的 ruby​​ 脚本中,我需要传递用户名和

  • 密码为纯文本,以便登录。用户名和密码当前都存储在我的脚本中。

  • 我对从脚本登录的服务器无法控制。该脚本在本地运行良好,将来我想转移到我的

  • 虚拟主机提供商并从那里运行它(我有 ssh 访问权限)

  • 使用 cron。有什么办法/方法如何

  • 保护密码以防万一有人访问此脚本?

【问题讨论】:

  • 安全不是一件小事(chargen.matasano.com/chargen/2007/9/7/…)。不要轻易做任何事情。
  • @outis: 是的 :-) 在我看来,我一直在本地运行脚本......
  • 服务器是否提供其他身份验证方法?您是否控制脚本登录的计算机,以便您自己更改身份验证协议?
  • @outis:我无法控制我登录的计算机......
  • 其他认证方式呢?询问系统管理员并没有什么坏处。

标签: ruby passwords password-protection


【解决方案1】:

我对此想得越多,我认为您必须越信任您的托管服务。我会确保托管服务“参与其中”:也就是说,他们托管足够多的“高知名度”帐户,如果发现不可信,对他们来说将付出非常高昂的代价(失去帐户和销售)。

无论您是否认为托管服务值得信赖,您都应该有一个计划,以防目标帐户被盗用。您将通知谁,您将如何停用该帐户等。

我能想到的唯一技术解决方案——您手动登录、捕获 cookie 并将该 cookie 提供给脚本——保护密码,但可能恶意主机可以使用该 cookie 进行他想要的任何破坏在目标系统上使用附加到该 cookie 的任何权限,包括更改您的密码。所以这根本不是解决方案。

哦,说到特权:您需要自动化的任务是否可以使用具有较低特权的目标帐户来完成,例如只读帐户,或者不能对其配置文件进行任何更改的目标帐户?在托管服务上只有您的低权限凭证会降低您的风险(或“暴露”,正如多音节人群喜欢说的那样)。

先前的答案,发现是行不通的,低于该行。


您可以使用另一个密码来加密用户 ID 和密码。为了运行,脚本必须提供 它的 密码。它使用该密码来解密 Web 服务的用户名和密码。确保脚本的密码不会存储在任何地方,而只会保存在内存中,并且仅保存足够长的时间以解密最终的用户 ID 和密码。

如果真的很重要,请确保运行脚本的连接是加密的(ssh、ssl 等),并确保脚本仅使用 https 登录。

这不会让你对盒子上具有 root 权限的人无懈可击(在某些时候,明文用户 ID 和密码将在内存中,因此容易受到攻击),但它确实让他们需要更多的工作能够获取用户 ID/密码。

更新:自动化的要求使得上述解决方案不好。

【讨论】:

  • @Radek,我已经考虑了更多。请看上面的线。
  • 我的网络服务提供商有“标准 unix 帐户”。在我看来,我很乐意从本地计算机手动运行脚本 ;-) 我想知道是否有任何解决方案。
  • @Radek,这就是我要做的。快乐的黑客攻击!
【解决方案2】:

您应该在数据库中存储密码的散列版本。哈希是一种单向加密,因此无法使用逻辑从哈希密码中猜出密码。

创建一个散列密码的方法,并执行以下操作:

require "digest/sha1"
class User
  attr_accessor :password

  def initialize(password)
    @password = hash_password(password)
  end

  def hash_password(password)
    Digest::SHA1.hexdigest(password)
  end

  def valid_password?(password)
    @password == hash_password(password)
  end
end

u = User.new("12345")
p u.password # => "8cb2237d0679ca88db6464eac60da96345513964"
p u.valid_password?("not valid") # => false
p u.valid_password?("12345") # => true

当您从表单中获取纯文本密码时,您将其传递给您的valid_password? 方法。这将执行与存储密码时相同的单向加密。因此,比较加密密码的一种方式。这意味着您永远不会在任何地方存储对实际密码的引用,这是一个巨大的胜利。

【讨论】:

  • @August Lilleaas:嗨 August,我知道密码,它存储在我的脚本中,我需要在表单中传递它才能登录。我的问题是我是否可以保护这样的密码,不知何故。
【解决方案3】:

如果自动化脚本需要使用密码运行某些内容,那么您要么必须让脚本读取它(这打开了其他人阅读它的可能性),要么不以自动化方式提供它。

诀窍是通过一次性启动绕过“自动化”部分:将脚本作为一个小的连续进程运行,该进程将定期唤醒并运行。让进程在启动时或通过某种其他类型的 API 请求(而不是在命令行上!)请求密码。

如果服务器重新启动,密码将丢失,直到您登录并再次输入密码。这样,密码只在内存中,不在文件系统中。

您可能需要一个 cron 作业来检查进程并在它未运行时提醒您。

【讨论】:

  • 将其保存在内存中是个好主意,尽管仍然有可能获得脚本写入权限的人可以修改它以静默地向他们发送密码副本。但是,是的,这将保护它免受任何获得脚本只读访问权限的人的影响,所以如果作为后台进程运行不是问题,那么值得考虑!
【解决方案4】:

如果您需要将密码继续传递给您可能无法更改以使用更安全方案的表单,除了混淆密码以使其不会立即显现之外,您几乎无能为力。但是,任何有权访问脚本本身的人都可以简单地找到它传递给表单的位置并插入一个命令以在此处打印密码——不管怎样,它都需要在此时“解密”才能传递给你.

为了保护它免受非程序员的影响,你可以用一些东西对它进行异或或旋转一些字母,但我不会花太多时间在这上面,因为它对几乎任何对它有初步了解的人都是徒劳的编程。相反,保护脚本本身不受其他用户的影响(正确设置文件访问权限,不要将其放在网络可见的目录中,等等)。如果您不信任服务器的管理,请不要将其上传到那里!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-18
    • 1970-01-01
    相关资源
    最近更新 更多