1. ホーム
  2. ジャワ

SHA1暗号化アルゴリズム(Java実装)

2022-03-02 15:55:26

SHA1暗号化アルゴリズム

SHAは、データ暗号化アルゴリズムの一つで、暗号学者によって長年にわたってますます改良され、現在では最も安全なハッシュアルゴリズムの一つとして認識され、広く使用されている。このアルゴリズムの考え方は、平文の一部を受け取り、それを不可逆的な方法で(通常はより小さな)暗号文の一部に変換することです。これは、入力コード列(プリマップまたはメッセージと呼ばれる)を受け取り、それらをハッシュ値として知られる、より短く固定ビット数の出力シーケンスに変換するプロセスとして簡単に理解することもできます(メッセージダイジェストまたはメッセージ認証コードとしても知られています)。ハッシュ関数の値は、平文の「指紋」または「ダイジェスト」とも呼ばれ、ハッシュ値のデジタル署名は平文のデジタル署名とみなすことができます。

SHA(Secure Hash Algorithm)は、米国標準技術研究所が発行する国家規格FIPS PUB 180(2008年にFIPS PUB 180-3に更新)で、SHA-1、SHA-224、SHA-256、SHA-384を規定し、2^64バイナリビット長までのメッセージに適用されます。SHA-384とSHA-512は、長さが2^128バイナリビットまでのメッセージに適用されます。

アルゴリズムの原理

SHA-1はデータ暗号化アルゴリズムの一つで、平文を不可逆な方法で暗号文(通常はより小さい)に変換するという考えに基づいています。また、入力コード列(プリマップまたはメッセージと呼ばれる)を受け取り、ハッシュと呼ばれるより短い固定ビット数の出力シーケンスに変換するプロセス(メッセージダイジェストまたはメッセージ認証コードともいう)にも簡単に対応しています。

一方向性ハッシュ関数の安全性は、ハッシュ値を生成する演算が強力な一方向性であることにある。SHAは、入力ストリームを1チャンクあたり512ビット(64バイト)ずつチャンクし、メッセージ認証コードまたはメッセージダイジェストと呼ばれる20バイトの出力を生成する。

このアルゴリズムでは、入力メッセージの長さは無制限で、160ビットのメッセージダイジェストを出力として生成します。入力は512ビットのパケットで処理される。SHA-1は不可逆的であり、衝突を防ぎ、雪崩効果に優れている。

デジタル署名は、ハッシュアルゴリズムによって実装することができる。デジタル署名の原理は、送信する平文を関数演算(Hash)によりメッセージダイジェストに変換し(異なる平文は異なるメッセージダイジェストに対応)、メッセージダイジェストを暗号化して平文とともに受信者に送信し、受信者は受け取った平文から新しいメッセージダイジェストを生成して復号化し送信者の受信メッセージダイジェストと比較し、比較結果が一致すれば平文は変更されていない、一致しない場合は平文は改竄されている、となるものです。

アルゴリズムのJava実装

public class SecuritySHA1Utils {

    /**
     * @Comment SHA1 implementation
     * @Author Ron
     * @Date Sep 13, 2017 3:30:36 PM
     * @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("original:" + str);
        System.out.println("SHA after: " + shaEncode(str));
    }
}




しかし、実際のアプリケーションでは、次のように org.apache.commons.codec.digest.DigestUtils を持ってきて暗号化を呼び出すだけでよいのです。

/**
* @Comment SHA1 encryption password
* @Author Ron
* @Date Sep 12, 2017 2:46:31 PM
* @return
*/
public static String encodePassword(String psw) {
    if(StringUtils.isEmpty(psw)){
        return null;
    }else{
        return DigestUtils.sha1Hex(psw);
    }
} 




オリジナルのアドレスです。  7. SHA1暗号アルゴリズム_Ron.Zheng-CSDNブログ_sha1暗号化