SHA 1暗号化アルゴリズム(java実装)

3009 ワード

SHA 1暗号化アルゴリズム
SHAはデータ暗号化アルゴリズムであり、このアルゴリズムは暗号化専門家の長年の発展と改善を経て日増しに改善され、現在では最も安全なハッシュアルゴリズムの一つとして公認され、広く使用されている.このアルゴリズムは、明文を受信し、不可逆的に暗号文に変換し(通常はより小さい)一連の入力コード(プリマッピングまたは情報と呼ばれる)を取り、長さが短く、ビット数が固定された出力シーケンスであるハッシュ値(情報要約または情報認証コードとも呼ばれる)に変換するプロセスを簡単に理解することができる.ハッシュ関数の値は、明文に対する「指紋」または「要約」と言えるので、ハッシュ値に対するデジタル署名は、この明文に対するデジタル署名と見なすことができます.
安全ハッシュアルゴリズムSHA(Secure Hash Algorithm,SHA)は、米国の国家標準技術研究所が発表した国家標準FIPS PUB 180であり、最新の標準は2008年にFIPS PUB 180-3に更新された.ここで、SHA−1、SHA−224、SHA−256、SHA−384、およびSHA−512のいくつかの一方向ハッシュアルゴリズムが規定される.SHA−1,SHA−224およびSHA−256は、長さが2^64バイナリビットを超えないメッセージに適している.SHA−384およびSHA−512は、2^128ビットを超えないメッセージに適用される.
アルゴリズムの原理
SHA−1は、明文を受信し、不可逆的に暗号文に変換することを想定したデータ暗号化アルゴリズムであり、一連の入力コード(プリマッピングまたは情報と呼ばれる)を取得し、長さが短く、ビット数が固定された出力シーケンスであるハッシュ値(情報要約または情報認証コードとも呼ばれる)に変換するプロセスとしても簡単に理解できる.
単方向ハッシュ関数のセキュリティは、ハッシュ値を生成する操作プロセスがより強い単方向性を有することにある.入力シーケンスにパスワードが埋め込まれている場合、誰もパスワードを知らない場合に正しいハッシュ値を生成することができず、セキュリティが保証されます.SHAは、入力ストリームをブロック512ビット(64バイト)ずつブロック化し、情報認証コードまたは情報要約と呼ばれる20バイトの出力を生成する.
このアルゴリズムは、入力メッセージの長さに制限されず、生成された出力は160ビットのメッセージ要約である.入力は512ビットのパケットで処理される.SHA−1は不可逆的で衝突を防ぎ,良好な雪崩効果を有する.
ハッシュアルゴリズムによってデジタル署名を実現することができ、デジタル署名の原理は、伝送する明文を1つの関数演算(Hash)によってメッセージ要約(異なる明文は異なるメッセージ要約に対応する)に変換し、メッセージ要約を暗号化した後、明文とともに受信者に送信し、受信者は受信した明文に対して新しいメッセージ要約を生成し、送信者の送信元のメッセージ要約と解読比較し、比較結果は一致して明文が変更されていないことを示し、一致しない場合は、明文が改ざんされたことを示します.
アルゴリズムJava実装
public class SecuritySHA1Utils {

    /**
     * @Comment SHA1  
     * @Author Ron
     * @Date 2017 9 13    3:30:36
     * @return
     */
    public static String shaEncode(String inStr) throws Exception {
        MessageDigest sha = null;
        try {
            sha = MessageDigest.getInstance("SHA");
        } catch (Exception e) {
            System.out.println(e.toString());
            e.printStackTrace();
            return "";
        }

        byte[] byteArray = inStr.getBytes("UTF-8");
        byte[] md5Bytes = sha.digest(byteArray);
        StringBuffer hexValue = new StringBuffer();
        for (int i = 0; i < md5Bytes.length; i++) {
            int val = ((int) md5Bytes[i]) & 0xff;
            if (val < 16) {
                hexValue.append("0");
            }
            hexValue.append(Integer.toHexString(val));
        }
        return hexValue.toString();
    }

    public static void main(String args[]) throws Exception {
        String str = new String("amigoxiexiexingxing");
        System.out.println("  :" + str);
        System.out.println("SHA :" + shaEncode(str));
    }
}


しかし実際の応用ではorgを直接導入することができる.apache.commons.codec.digest.DigestUtilsは、次のように暗号化を呼び出せばよい.
/**
* @Comment SHA1    
* @Author Ron
* @Date 2017 9 12    2:46:31
* @return
*/
public static String encodePassword(String psw) {
    if(StringUtils.isEmpty(psw)){
        return null;
    }else{
        return DigestUtils.sha1Hex(psw);
    }
} 


原文住所:https://blog.csdn.net/zyhlwzy/article/details/77967255