rails項(xiàng)目中使用pbkdf2存儲(chǔ)密碼

使用pbkdf2 存儲(chǔ)密碼

關(guān)鍵詞 salt 計(jì)算次數(shù)可控 防止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| #只要任一表達(dá)式的一位為 1,則結(jié)果的該位為 1。否則,結(jié)果的該位為 0。
      result |= c ^ cmp[i] #當(dāng)且僅當(dāng)只有一個(gè)表達(dá)式的某位上為 1 時(shí),結(jié)果的該位才為 1。否則結(jié)果的該位為 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
在這里看到的
知乎上對(duì) timing attack 的一些觀點(diǎn)https://www.zhihu.com/question/20156213

這是看過的最好一篇關(guān)于密碼存儲(chǔ)的文章http://blog.jobbole.com/61872/

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • # Python 資源大全中文版 我想很多程序員應(yīng)該記得 GitHub 上有一個(gè) Awesome - XXX 系列...
    aimaile閱讀 26,840評(píng)論 6 427
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,628評(píng)論 19 139
  • 作為一個(gè)前端程序猿,下面這些站會(huì)讓你眼前一亮。 amazeui框架組建豐富 http://amazeui.org...
    歐巴冰冰閱讀 9,040評(píng)論 18 303
  • 深夜,寫點(diǎn)什么。 怕我逐漸老去就再?zèng)]有了提筆書寫的勇氣。 我的回憶中有很多南方生活的故事,燥熱的夏天,海邊,十號(hào)別...
    MarkHoly閱讀 271評(píng)論 0 0
  • 從現(xiàn)在開始,在每一件瑣細(xì)的小事中發(fā)現(xiàn)并尊重你自己的感覺?!渲炯t 作者:武志紅 一棵小樹如果不斷地被拔出大地,它...
    心樂土武志紅閱讀 1,160評(píng)論 4 17

友情鏈接更多精彩內(nèi)容