bcrypt暗号化アルゴリズム


前言
私は社内で「インターフェース管理システム」(DRIM)を作りました.このシステムのユーザー認証は会社の既存のコード管理プラットフォームgitlabと一致する必要があります.DRIMがgitlabのデータベースを直接読んで認証する方法を採用しているので、gitlabがパスワードを暗号化する方法を知る必要があります.
プロセス
1.データベースの検索
このプロセスは簡単で、すぐにusersテーブルが見つかりました.encrypted_が入っています.passwordは、パスワードが暗号化された文字列を示す列です.
2.暗号化アルゴリズムを探す
密文の文字列は見つかったが、taは一般的なsha 1/md 5の流れではないので、gitlabhq@github狂ったように探して、コードを探して、userのようなものを見つけることができることを妄想しています.login($username,$userpaswd)の関数は実現されるが,1時間も収穫がない.
その後googleは1つのホームページに行ってdeviseがどんな暗号化アルゴリズムを使うかを言って、deviseは私はソースコードの中で何度も見たことがあって、しかもそれはきっと認証と関係があるに違いありません.さらにdeviseを見てみると、taはRoRのユーザー認証コンポーネントであり、RoRアプリケーションに統合されやすく、ユーザー認証をかなり完璧+簡単に解決することができます(システムごとに、ユーザー認証の流れは基本的に同じで、これもdeviseが独立したコンポーネントとしての意味です).
deviseコンポーネントは、暗号化アルゴリズムとしてbcryptをデフォルトで使用し、sha 512、md 5という簡単な要約アルゴリズムもサポートします.gitlabは、デフォルトのbcryptをパスワードとする暗号化アルゴリズムを使用します.
bcryptアルゴリズムについて
これまで使ったことがなかったのでgoogleを続けたところ、RoRで使われていることが多く(deviseコンポーネントのおかげ)、他のタイプの開発フレームワークでは多くないようで、googleの結果は少ないことがわかりました.まず大体taの使用を理解しました:
  • saltとcostの2つの値によって暗号化プロセスを遅らせ、taの暗号化時間(100 ms級)はmd 5(約1 ms程度)をはるかに上回った.
  • cost値もよく理解していませんが、私はしばらくtaを反復回数と見なしています.RoRのdeviseコンポーネントのデフォルトのcostは10ですが、実際には12が推奨されています.
  • bcryptは一方向であり、saltとcostの処理を経て、rainbow攻撃による解読の確率を大幅に低下させ、同時に解読の難易度も大幅に向上させた.
  • bcrypt暗号化後の文字列形は、$2 a$10$asdjflkaydgigadfahgl.asdfaoygoqhgasldhf、$は分割子であり、意味がない.2 aはbcrypt暗号化バージョン番号である.10はcostの値です.その後の上位22位はsalt値である.それから文字列はパスワードの暗号文です.

  • bcryptのpythonライブラリ
    私はRoRを使わなくて(だから半日deviseを探したのは何ですか)、普段pythonを使うことが多くて、DRIMシステムもpythonが開発したのです.だからpythonでbcryptを使って資料を探しました.
    pythonのこのパッケージはbcryptと呼ばれ、インストール方法:pip install bcrypt;
    demoコードは次のとおりです.
     import bcrypt
    
    password = b"yourpassword"
     #  password 10    ,           hashed,  :$2a$10$aoiufioadsifuaisodfuiaosdifasdf
    hashed = bcrypt.hashpw(password, bcrypt.gensalt(10))
    #        password    ,  bcrypt.hashpw()         salt,bcrypt       、cost  22  salt,         hash        
    if bcrypt.hashpw(password, hashed) == hashed:
         print("It Matches!")
    else:
         print("It Does not Match :(")

    このアルゴリズムは良くて、もっと安全で、性能に対する要求が特に高くない场合に使うことができて、后で私はよくtaを使うつもりです!^^;