素晴らしい安全な旅行HMACアルゴリズム

みなさん、こんにちは。本日、メッセージダイジェストアルゴリズムにHMAC(Keyed-Hashing for Message Authentication)メッセージ認証コードアルゴリズムの導入を開始しました。MAC(メッセージ認証コード、メッセージ認証コードアルゴリズム)は、キーハッシュ関数を含むアルゴリズムです。互換性がありますMDおよびSHAアルゴリズムの特性、およびこれに基づくキーの追加。したがって、MACアルゴリズムはしばしばHMACアルゴリズムと呼ばれます。

マック

始める前に、MACアルゴリズムについて説明しましょう。最近のネットワークでは、ID認証が頻繁に使用される機能です。ID認証プロセスでは、ユーザー情報のセキュリティを確保する方法が多数あり、MAC(メッセージ認証コード)が一般的に使用される方法です。

メッセージ認証コードは、メッセージを認証し、その整合性を確認するためのテクノロジーです。送信者と受信者の間で共有される秘密鍵を使用することにより、偽装や改ざんがないかどうかを識別することができます。

MACは、[MACアルゴリズム+キー+暗号化する情報]の3つの要素から計算されます。

ハッシュアルゴリズム(メッセージダイジェスト)と比較すると、メッセージダイジェストはメッセージの整合性のみを保証できます。つまり、メッセージダイジェストBはメッセージAによって生成されます。MACアルゴリズムは、メッセージの正確性を保証できます。つまり、メッセージCの代わりにメッセージAが送信されたと判断されます。

公開秘密鍵システムと比較すると、MAC鍵は送信者と受信者で同じであるため、送信者と受信者の両方がMACを生成できます。公開秘密鍵システムは公開鍵を秘密鍵から分離するため、Nonを追加します。 -否認。

MACを実装する方法はたくさんありますが、最も一般的な方法は、今日説明するHMACアルゴリズムなど、ハッシュアルゴリズムに基づくMACです。OMAC、CBC-MAC、PMACなどのブロック暗号に基づく実装もあります。

HMAC

HMACアルゴリズムは、最初に情報ダイジェストアルゴリズムに基づいています。現在、MDとSHAの2つの一連のメッセージダイジェストアルゴリズムが主に組み立てられています。その中で、MDシリーズのアルゴリズムにはHmacMD2、HmacMD4、およびHmacMD5が含まれ、SHAシリーズのアルゴリズムにはHmacSHA1、HmacSHA224、HmacSHA256、HmacSHA384、およびHmacSHA512が含まれます。

メッセージダイジェストアルゴリズムに加えて、HMACアルゴリズムにもキーが必要です。HMACキーの長さは任意です。キーの長さがダイジェストアルゴリズム情報パケットの長さを超える場合、最初にダイジェストアルゴリズムを使用して、キーのダイジェストが新しいキーとして計算されます。キーの長さはセキュリティ強度に関係するため、一般的に短すぎるキーの使用はお勧めしません。通常、選択されたキーの長さは、選択されたダイジェストアルゴリズムによって出力された情報ダイジェストの長さ以上です。

MDアルゴリズムの比較

アルゴリズム 要約の長さ(ビット) リアライザー
HmacMD5 128 JDK、バウンシーキャッスル、コモンズコーデック
HmacSHA1 160 JDK、バウンシーキャッスル、コモンズコーデック
HmacSHA224 224 JDK、バウンシーキャッスル、コモンズコーデック
HmacSHA256 256 JDK、バウンシーキャッスル、コモンズコーデック
HmacSHA384 384 JDK、バウンシーキャッスル、コモンズコーデック
HmacSHA512 512 JDK、バウンシーキャッスル、コモンズコーデック

HMACアルゴリズムの実装

JDKのHMACアルゴリズムの実装

HMACアルゴリズムのJDK実装:

// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {
    
    
    try {
    
    
        // 1、创建密钥生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
        // 2、产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 3、获取密钥
        byte[] key = secretKey.getEncoded();
        // 4、返回密钥
        return key;
    } catch (Exception e) {
    
    
        throw new RuntimeException(e);
    }
}

// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {
    
    
    try {
    
    
        // 1、还原密钥
        SecretKey secretKey = new SecretKeySpec(key, algorithm);
        // 2、创建MAC对象
        Mac mac = Mac.getInstance(algorithm);
        // 3、设置密钥
        mac.init(secretKey);
        // 4、数据加密
        byte[] bytes = mac.doFinal(data);
        // 5、生成数据
        String rs = encodeHex(bytes);
        // 6、返回十六进制加密数据
        return rs;
    } catch (Exception e) {
    
    
        throw new RuntimeException(e);
    }
}
バウンシーキャッスルのHMACアルゴリズムの実装

Bouncy CastleによるHMACアルゴリズムの実装:

// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {
    
    
    try {
    
    
        // 1、创建密钥生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
        // 2、产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 3、获取密钥
        byte[] key = secretKey.getEncoded();
		// 4、返回密钥
        return key;
    } catch (Exception e) {
    
    
        throw new RuntimeException(e);
    }
}

// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {
    
    
    HMac hmac = generateHmacByAlgorithm(algorithm);
    KeyParameter keyParameter = new KeyParameter(key);
    hmac.init(keyParameter);
    hmac.update(data, 0, data.length);
    byte[] rsData = new byte[hmac.getMacSize()];
    hmac.doFinal(rsData, 0);

    return Hex.toHexString(rsData);
}
CommonsCodecのHMACアルゴリズムの実装

Commons Codecによって提供されるHMACアルゴリズムの実装:

// 获取 HMAC Key
public static byte[] getHmacKey(String algorithm) {
    
    
    try {
    
    
        // 1、创建密钥生成器
        KeyGenerator keyGenerator = KeyGenerator.getInstance(algorithm);
        // 2、产生密钥
        SecretKey secretKey = keyGenerator.generateKey();
        // 3、获取密钥
        byte[] key = secretKey.getEncoded();
		// 4、返回密钥
        return key;
    } catch (Exception e) {
    
    
        throw new RuntimeException(e);
    }
}

// HMAC 加密
public static String encryptHmac(byte[] data, byte[] key, String algorithm) {
    
    
    Mac mac = HmacUtils.getInitializedMac(HmacAlgorithms.HMAC_MD5, key);
    return Hex.encodeHexString(mac.doFinal(data));
}

完全なコードについては、次のWebサイトをご覧ください。

https://github.com/ForTheDevelopers/JavaSecurity

HMACアルゴリズムの適用

1.ピアユーザーの正当性を検証できます

HMACアルゴリズムの一般的なアプリケーションは、「チャレンジ/レスポンス」(チャレンジ/レスポンス)ID認証で使用されます。認証プロセスは次のとおりです。

(1)まず、クライアントはサーバーに検証要求を送信します(ブラウザーからのGET要求であると想定)。

(2)サーバーは、この要求を受信した後に乱数を生成し、ネットワークを介してクライアントに送信します(これは課題です)。

(3)クライアントは、受信した乱数と自身の鍵に対してHMAC操作を実行し、認証の証拠として結果を取得してサーバーに返します(これは応答です)。

(4)同時に、サーバーは、サーバーデータベースに格納されている乱数とクライアントキーを使用してHMAC計算を実行します。サーバーの計算結果がクライアントから返された応答と同じである場合、クライアントは正当なユーザー。

このプロセスでは、サーバーから送信された乱数とクライアントから返されたHMACの結果がセキュリティによって攻撃される可能性がありますが、これら2つの値を傍受したハッカーにとって、これら2つの値は無意味です。ランダム値の導入によりHMACが作成されます現在のセッションでのみ有効であり、セキュリティと実用性が大幅に向上します。

2.相手にメッセージを送信する(または相手からメッセージを受信する)

たとえば、キーKを相手と共有していて、相手にメッセージを送信したい場合は、メッセージが改ざんされていないこと(整合性)を確認するだけでなく、情報が改ざんされていないことを証明する必要があります。実際に送信されます(ソース認証)。HMACによって計算された元の情報とキーKの値が一緒に送信されます。相手が受信したら、手元のキーKと元のメッセージを使用してHMAC値を計算します。送信したHMACと同じ場合は、メッセージが改ざんまたは偽装されていないと見なすことができます。 。

通常のハッシュアルゴリズムとHMACアルゴリズムの違い

通常のハッシュアルゴリズムは、ハッシュを介して出力されるデータをダイジェストすることです。データが受信されると、ソースデータもハッシュされ、指定されたハッシュ値と比較されて、受信したデータが計算されたハッシュ値と一致するかどうかが確認されます。 。

一般的に、送信データとハッシュ値は異なるチャネルによって提供されます。たとえば、MD5またはSHAハッシュ値はWebページに表示されますが、ダウンロードリンクはミラーWebサイトであり、ダウンロードするファイルには影響しません。正しさ。

同じチャネル(メッセージ認証コードなど)を介してデータとハッシュ値を送信する場合は、データとハッシュ値が同時に改ざんされるかどうかを検討する必要があります。サードパーティがデータを変更する場合、次にMD5ハッシュを実行すると、ワンピースが受信者に送信され、受信者はデータが改ざんされたことを検出できません。

HMACアルゴリズムは、送信者と受信者の両方が持っているキーキーを使用して計算でき、このキーキーを持たないサードパーティは正しいハッシュ値を計算できないため、データのソースが改ざんされるのを防ぐことができます。

総括する

現在、HMACアルゴリズムのアプリケーションシナリオは比較的少なく、暗号化アルゴリズムは通常、ソースの正確性を確保するために直接使用されます。ただし、HMACには特定のシナリオでの特定の用途があります。使用する暗号化は、ビジネスの特性に応じて選択できます。アルゴリズム。また、このシリーズのすべてのソースコードを入手するには、公式アカウントに注意を払い、[暗号化と復号化]に返信してください。

作成するのは簡単ではありません。この記事が気に入ったら、気に入って転送してください。あなたの注意は、私たちが前進する原動力です_

「私は開発者FTDです」公式アカウント、WeChatアカウント:ForTheDevelopersをフォローしてください。

また、私の個人的なWeChatエクスチェンジであるWeChat ID:ForTheDeveloperを追加してください。

開発に注意を払い、開発者にもっと注意を払ってください!

おすすめ

転載: blog.csdn.net/ForTheDevelopers/article/details/112592362