ruby-on-rails - 最灵活的 Rails 密码安全实现

标签 ruby-on-rails ruby security gem passwords

<分区>

我需要实现具有各种灵活需求的密码安全。这些要求基本上取自 Sans password policy :

Strong passwords have the following characteristics:

Contain at least three of the five following character classes:

  • Lower case characters
  • Upper case characters
  • Numbers
  • Punctuation
  • “Special” characters (e.g. @#$%^&*()_+|~-=`{}[]:";'<>/ etc)
  • Contain at least fifteen alphanumeric characters.

还有要求不允许用户的电子邮件地址出现在密码中。

理想情况下,我想要一个能够处理这个问题的 gem - 它会得到更广泛的测试和使用,并且我们不太可能出现错误。

如果没有 gem 涵盖这一点,那么处理这些要求的最佳和最严格的方法是什么?理想情况下,我们可以说我们不仅安全,而且安全,因为我们实现了行业标准。

到目前为止我发现的 gem 是:

  • Strong Password ,它看起来只是提供熵检查,让用户知道他们的密码是否安全。

(我们正在使用 Rails 3.2.17 和 Ruby 1.9.3,但计划很快迁移到 Rails 4 和 Ruby 2,因此也欢迎更新的解决方案)。

最佳答案

我们使用设计安全扩展已有一段时间了。它有很多有趣的功能(例如密码历史记录、密码过期...)。

对于密码复杂性,我们想要一些更可配置的东西(在您的示例中:让客户选择他们想要的复杂性级别)。

因此我们根据分数推出了自己的解决方案:5 分中的 3 分(在您的示例中)意味着我们正在测试每个特性,如果找到则给一分。 如果总分等于或大于要求的分数,那么密码就可以了。

就代码而言,我们的验证如下所示:

validate :password_complexity

def password_complexity
 return if password.nil?

 if password.size < 8
   errors.add :password, "Must be at least 8 characters long."
   return
 end

 required_complexity = 3 # we're actually storing this in the configuration of each customer

 if !CheckPasswordComplexityService.new(password, required_complexity).valid?
   errors.add :password, "Your password does not match the security requirements."
 end
end

检查复杂性的服务如下所示:

class CheckPasswordComplexityService

  attr_reader :password, :required_complexity

  def initialize(password, required_complexity)
    @password = password
    @required_complexity = required_complexity
  end

  def valid?
    score = has_uppercase_letters? + has_digits? + has_extra_chars? + has_downcase_letters?

    score >= required_complexity
  end

  private

  def has_uppercase_letters?
    password.match(/[A-Z]/) ? 1 : 0
  end

  def has_digits?
    password.match(/\d/) ? 1 : 0
  end

  def has_extra_chars?
    password.match(/\W/) ? 1 : 0
  end

  def has_downcase_letters?
    password.match(/[a-z]{1}/) ? 1 : 0
  end
end

然后添加一些您要检查的新特征变得非常容易。

关于ruby-on-rails - 最灵活的 Rails 密码安全实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22052473/

相关文章:

mysql - 我怎样才能让 ruby​​ on rails 处理来自 MySQL 的重复记录错误

arrays - 不太清楚 join 操作在 ruby​​ 数组中是如何工作的

ruby - 从相同方法的 lib 文件中访问 Rails 模型名称

ios - MITM 攻击报告已弃用的 NSURLConnectionDelegate

ruby-on-rails - 禁用 Ruby on Rails 中的文本框?

ruby-on-rails - rails : Non id foreign key lookup ActiveRecord

sql - rails 3 : Can't create relationship :has_one

ruby-on-rails - 如何根据我的布局加载不同的 Assets ?

java - 有没有办法知道java中的服务器文件目录结构?

iphone - 如何在 iPhone 上激活/停用 "slide to unlock"?