【暗号学】BCryptアルゴリズムjava実装

2932 ワード

一、概説
どのようなアルゴリズムでユーザーのパスワードを保存しますか?もしあなたがまだコードを使っているなら、あなたのサイトがhackされると、あなたのすべてのユーザーのパスワードが漏れてしまいます.これは、あなたのシステムやサイトが終わったことを意味します.したがって,ユーザのパスワードをいくつかの不可逆的なアルゴリズムで保存する必要がある.例えば、MD 5、SHA 1、SHA 256、SHA 512、SHA−3などのHashアルゴリズム.これらのアルゴリズムはいずれも不可逆的である.システムは、ユーザのパスワードを検証する際に、Hash暗号化されたパスワードと、後でパスワードが格納されているデータベースのパスワードを比較し、一致すれば検証が通過する.しかし、これらのアルゴリズムは良いと思いますか?私が言ったのは、MD 5、SHA 1、SHA 256、SHA 512、SHA-3です.MD 5アルゴリズムを使用してパスワードを暗号化している場合は、パスワードの長さが小文字に数字を加えている場合は、パスワードの長さが6ビットであると仮定すると、現在の比較的新しいPC機では、すべてのパスワードを挙げるのに40秒しかかかりません.ほとんどのユーザーが小文字と数字だけでパスワードを整理していることがわかります.6ビット長のパスワードは最大40秒で解読できるので、驚くかもしれません.もしあなたが2000ドルと1週間をかけてCUDAを構築したいなら、あなたが構築したこのクラスタでパスワードの窮屈な演算を行うことができます.その速度は、1秒で7億個のパスワードを計算することができます.現在実際に使用されている複雑なパスワードについても、その解読率は毎秒1つに達することができます.もちろん,ここでいうアルゴリズムはMD 5,SHAなどのアルゴリズムである.    
では、このような状況にとって、私たちはどうすればいいのでしょうか.私たちはまだ方法がある.MD 5,SHAのアルゴリズム速度が速すぎることを知っています.したがって、「遅い」暗号化アルゴリズムが必要です.bcryptはこのようなアルゴリズムです.それは遅いので、コンピュータにとっては少しBTが遅いですが、ちょうどいいです.ユーザーパスワードの検証は遅くありません.ユーザーパスワードを挙げると、コンピュータはカタツムリのようになります.bcryptは一連の様々なBlowfish暗号化アルゴリズムを採用し、work factorを導入したため、この動作因子はこのアルゴリズムの代価がどれだけ大きいかを決定することができます.これらのため,このアルゴリズムはコンピュータCPUの処理速度が速くなったためにアルゴリズムの時間が短縮されることはない.なぜなら、work factorを増やして性能を下げることができるからです.では、bcryptはいったいどれくらい遅いのでしょうか.MD 5と比較すると、12のwork factorを使用すると「cool」を暗号化するとbcryptは0.3秒、MD 5は1マイクロ秒(百万分の1秒)しかかかりません.すなわち,前述したように,可能なMD 5符号化のパスワードを40秒ですべて網羅できるアルゴリズムは,bcryptを用いると12年かかる.これがbcryptの選択です.安全なパスワードと高速な暗号化アルゴリズム、あるいはあまり安全ではないパスワードと性能の悪い暗号化アルゴリズムができます.
要するに、bcryptは1つのハッシュアルゴリズムであり、1つの明文は複数の暗号文をマッピングするが、同じ暗号文は異なる暗号検査値BCryptである.checkpw一致;MD 5よりも安全で速度が遅い.
二、JAVA実現
1.公式サイトのダウンロードソース:http://www.mindrot.org/projects/jBCrypt/
2.BCrypt.JAvaをプロジェクトにコピーし、
package EncryptAndDecrypt;

import java.util.Scanner;
/*
* BCrypt Java  
* BCrypt        ,  MD5   ,   
* */
public class UseBCrypt {
    public static void main(String args[]){
        Scanner scanner=new Scanner(System.in);
        System.out.println("     :");
        String password=scanner.nextLine();//  
        System.out.println("        :");
        String candidate=scanner.nextLine();
        //        password
        String hashed = BCrypt.hashpw(password, BCrypt.gensalt());//  

        // gensalt's log_rounds parameter determines the complexity
        // the work factor is 2**log_rounds, and the default is 10
        String hashed2 = BCrypt.hashpw(password, BCrypt.gensalt(12));
        System.out.println(hashed);
        System.out.println(hashed2);
        //        
        if (BCrypt.checkpw(candidate, hashed))
            System.out.println("It matches");
        else
            System.out.println("It does not match");
    }
}
     :
123456
        :
234563
$2a$10$RbX30iBRU0/rZtY9itIYF.F7PlqZAkHuYQFDDSE9ESOU9z.i.1gZu
$2a$12$waisaCtTw8EvT/ddNEz1kOFPdIAHHIfPQk0QhOLGSAcgDPjCv5s0K
It does not match
転入先:https://yq.aliyun.com/articles/48942