如何在我的脚本中保护纯文本密码? (红宝石)

时间:2010-02-14 10:53:02

标签: ruby passwords password-protection

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

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

  • 我在服务器上无控制我从脚本登录。脚本本地工作正常,将来我想转到我的

  • 网站托管服务提供商并从那里运行(我有ssh访问权限)

  • 使用cron

  • 有什么办法/方法吗?
  • 保护密码,以防有人有机会访问此脚本?

4 个答案:

答案 0 :(得分:1)

我想的越多,我认为你必须更信任你的托管服务。我会确保托管服务有“皮肤在游戏中”:也就是说,他们拥有足够的“高调”帐户,被发现不值得信任,对他们来说是非常昂贵的(在帐户和销售中丢失)。

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

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

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

之前的答案,发现是不可行的,低于界限。


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

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

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

已更新:自动化的要求使上述解决方案无效。

答案 1 :(得分:1)

如果自动脚本需要使用密码运行某些内容,那么您必须让脚本可以读取它(这可能会让其他人阅读它),或者不在自动化中提供它。

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

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

您可能希望cron作业检查进程并在未运行时提醒您。

答案 2 :(得分:1)

如果您需要将密码向前传递到您可能无法更改的表单以使用更安全的方案,那么除了模糊密码之外,您几乎无法做到这一点,因此它不会立即变得明显。但是,任何有权访问脚本的人都可以简单地找到它传递给表单的位置,并插入一个命令来打印密码 - 那时需要“解密”才能传递它,无论是什么

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

答案 3 :(得分:0)

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

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

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?方法。这将执行与存储密码时相同的单向加密。因此,比较了单向加密密码。这意味着您永远不会在任何地方存储对实际密码的引用,这是一个巨大的胜利。