rails项目中使用pbkdf2存储密码

使用pbkdf2 存储密码

关键词 salt 计算次数可控 防止timing attack

class Admin < ActiveRecord::Base
  ##the table admins in db must has filed username and digest
  ##http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/PKCS5.html
  def digest=(password)
    ##strict_encode64 [a-zA-Z0-9+/ pad = ]http://www.rfc-base.org/txt/rfc-3548.txt
    salt = Base64.strict_encode64(OpenSSL::Random.random_bytes(16))
    iter = 20000
    key_len = 16
    dg = Base64.strict_encode64(OpenSSL::PKCS5.pbkdf2_hmac_sha1(password, salt, iter, key_len))
    super("#{dg}|#{salt}")
  end

  def check_password(password)
    right_digest, salt = self.digest.split('|')
    iter = 20000
    key_len = 16
    dg = Base64.strict_encode64(OpenSSL::PKCS5.pbkdf2_hmac_sha1(password, salt, iter, key_len))
    eql_time_cmp(right_digest, dg)
  end
  
  #avoid timing attacks
  def eql_time_cmp(a, b)
    unless a.length == b.length
      return false
    end
    cmp = b.bytes.to_a
    result = 0
    a.bytes.each_with_index {|c,i| #只要任一表达式的一位为 1,则结果的该位为 1。否则,结果的该位为 0。
      result |= c ^ cmp[i] #当且仅当只有一个表达式的某位上为 1 时,结果的该位才为 1。否则结果的该位为 0。
    }
    result == 0
  end

  class << self

    def create_administrator(username, password)
      admin = Admin.new(username: username)
      admin.digest = password
      admin.save
    end

    def check_administrator(username, password)
     admin = Admin.find_by(username:username)
     admin && admin.check_password(password)
    end
  end
end

timing attack

http://ruby-doc.org/stdlib-2.0.0/libdoc/openssl/rdoc/OpenSSL/PKCS5.html
在这里看到的
知乎上对 timing attack 的一些观点https://www.zhihu.com/question/20156213

这是看过的最好一篇关于密码存储的文章http://blog.jobbole.com/61872/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    aimaile阅读 26,599评论 6 427
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • 作为一个前端程序猿,下面这些站会让你眼前一亮。 amazeui框架组建丰富 http://amazeui.org...
    欧巴冰冰阅读 8,931评论 18 303
  • 深夜,写点什么。 怕我逐渐老去就再没有了提笔书写的勇气。 我的回忆中有很多南方生活的故事,燥热的夏天,海边,十号别...
    MarkHoly阅读 232评论 0 0
  • 从现在开始,在每一件琐细的小事中发现并尊重你自己的感觉。——武志红 作者:武志红 一棵小树如果不断地被拔出大地,它...
    心乐土武志红阅读 1,053评论 4 17