KeyedHashAlgorithm クラス

定義

キー付きハッシュ アルゴリズムのすべての実装の派生元となる抽象クラスを表します。

``public ref class KeyedHashAlgorithm abstract : System::Security::Cryptography::HashAlgorithm``
``public abstract class KeyedHashAlgorithm : System.Security.Cryptography.HashAlgorithm``
``````[System.Runtime.InteropServices.ComVisible(true)]
public abstract class KeyedHashAlgorithm : System.Security.Cryptography.HashAlgorithm``````
``````type KeyedHashAlgorithm = class
inherit HashAlgorithm``````
``````[<System.Runtime.InteropServices.ComVisible(true)>]
type KeyedHashAlgorithm = class
inherit HashAlgorithm``````
``````Public MustInherit Class KeyedHashAlgorithm
Inherits HashAlgorithm``````

KeyedHashAlgorithm

例

クラスから派生する方法を次のコード例に示し KeyedHashAlgorithm ます。

``````using System;
using System.Security.Cryptography;

public class TestHMACMD5
{
static private void PrintByteArray(Byte[] arr)
{
int i;
Console.WriteLine("Length: " + arr.Length);
for (i = 0; i < arr.Length; i++)
{
Console.Write("{0:X}", arr[i]);
Console.Write("    ");
if ((i + 9) % 8 == 0) Console.WriteLine();
}
if (i % 8 != 0) Console.WriteLine();
}
public static void Main()
{
// Create a key.
byte[] key1 = { 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b, 0x0b };
// Pass the key to the constructor of the HMACMD5 class.
HMACMD5 hmac1 = new HMACMD5(key1);

// Create another key.
byte[] key2 = System.Text.Encoding.ASCII.GetBytes("KeyString");
// Pass the key to the constructor of the HMACMD5 class.
HMACMD5 hmac2 = new HMACMD5(key2);

// Encode a string into a byte array, create a hash of the array,
// and print the hash to the screen.
byte[] data1 = System.Text.Encoding.ASCII.GetBytes("Hi There");
PrintByteArray(hmac1.ComputeHash(data1));

// Encode a string into a byte array, create a hash of the array,
// and print the hash to the screen.
byte[] data2 = System.Text.Encoding.ASCII.GetBytes("This data will be hashed.");
PrintByteArray(hmac2.ComputeHash(data2));
}
}
public class HMACMD5 : KeyedHashAlgorithm
{
private MD5 hash1;
private MD5 hash2;
private bool bHashing = false;

private byte[] rgbInner = new byte[64];
private byte[] rgbOuter = new byte[64];

public HMACMD5(byte[] rgbKey)
{
HashSizeValue = 128;
// Create the hash algorithms.
hash1 = MD5.Create();
hash2 = MD5.Create();
// Get the key.
if (rgbKey.Length > 64)
{
KeyValue = hash1.ComputeHash(rgbKey);
// No need to call Initialize; ComputeHash does it automatically.
}
else
{
KeyValue = (byte[])rgbKey.Clone();
}
// Compute rgbInner and rgbOuter.
int i = 0;
for (i = 0; i < 64; i++)
{
rgbInner[i] = 0x36;
rgbOuter[i] = 0x5C;
}
for (i = 0; i < KeyValue.Length; i++)
{
rgbInner[i] ^= KeyValue[i];
rgbOuter[i] ^= KeyValue[i];
}
}

public override byte[] Key
{
get { return (byte[])KeyValue.Clone(); }
set
{
if (bHashing)
{
throw new Exception("Cannot change key during hash operation");
}
if (value.Length > 64)
{
KeyValue = hash1.ComputeHash(value);
// No need to call Initialize; ComputeHash does it automatically.
}
else
{
KeyValue = (byte[])value.Clone();
}
// Compute rgbInner and rgbOuter.
int i = 0;
for (i = 0; i < 64; i++)
{
rgbInner[i] = 0x36;
rgbOuter[i] = 0x5C;
}
for (i = 0; i < KeyValue.Length; i++)
{
rgbInner[i] ^= KeyValue[i];
rgbOuter[i] ^= KeyValue[i];
}
}
}
public override void Initialize()
{
hash1.Initialize();
hash2.Initialize();
bHashing = false;
}
protected override void HashCore(byte[] rgb, int ib, int cb)
{
if (bHashing == false)
{
hash1.TransformBlock(rgbInner, 0, 64, rgbInner, 0);
bHashing = true;
}
hash1.TransformBlock(rgb, ib, cb, rgb, ib);
}

protected override byte[] HashFinal()
{
if (bHashing == false)
{
hash1.TransformBlock(rgbInner, 0, 64, rgbInner, 0);
bHashing = true;
}
// Finalize the original hash.
hash1.TransformFinalBlock(new byte[0], 0, 0);
// Write the outer array.
hash2.TransformBlock(rgbOuter, 0, 64, rgbOuter, 0);
// Write the inner hash and finalize the hash.
hash2.TransformFinalBlock(hash1.Hash, 0, hash1.Hash.Length);
bHashing = false;
return hash2.Hash;
}
}
``````
``````Imports System.Security.Cryptography
_

Public Class TestHMACMD5

Private Shared Sub PrintByteArray(ByVal arr() As [Byte])
Dim i As Integer
Console.WriteLine(("Length: " + arr.Length.ToString()))
For i = 0 To arr.Length - 1
Console.Write("{0:X}", arr(i))
Console.Write("    ")
If (i + 9) Mod 8 = 0 Then
Console.WriteLine()
End If
Next i
If i Mod 8 <> 0 Then
Console.WriteLine()
End If
End Sub

Public Shared Sub Main()
' Create a key.
Dim key1 As Byte() = {&HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB, &HB}
' Pass the key to the constructor of the HMACMD5 class.
Dim hmac1 As New HMACMD5(key1)

' Create another key.
Dim key2 As Byte() = System.Text.Encoding.ASCII.GetBytes("KeyString")
' Pass the key to the constructor of the HMACMD5 class.
Dim hmac2 As New HMACMD5(key2)

' Encode a string into a byte array, create a hash of the array,
' and print the hash to the screen.
Dim data1 As Byte() = System.Text.Encoding.ASCII.GetBytes("Hi There")
PrintByteArray(hmac1.ComputeHash(data1))

' Encode a string into a byte array, create a hash of the array,
' and print the hash to the screen.
Dim data2 As Byte() = System.Text.Encoding.ASCII.GetBytes("This data will be hashed.")
PrintByteArray(hmac2.ComputeHash(data2))
End Sub
End Class
_

Public Class HMACMD5
Inherits KeyedHashAlgorithm
Private hash1 As MD5
Private hash2 As MD5
Private bHashing As Boolean = False

Private rgbInner(64) As Byte
Private rgbOuter(64) As Byte

Public Sub New(ByVal rgbKey() As Byte)
HashSizeValue = 128
' Create the hash algorithms.
hash1 = MD5.Create()
hash2 = MD5.Create()
' Get the key.
If rgbKey.Length > 64 Then
KeyValue = hash1.ComputeHash(rgbKey)
' No need to call Initialize; ComputeHash does it automatically.
Else
KeyValue = CType(rgbKey.Clone(), Byte())
End If
' Compute rgbInner and rgbOuter.
Dim i As Integer = 0
For i = 0 To 63
rgbInner(i) = &H36
rgbOuter(i) = &H5C
Next i
i = 0
For i = 0 To KeyValue.Length - 1
rgbInner(i) = rgbInner(i) Xor KeyValue(i)
rgbOuter(i) = rgbOuter(i) Xor KeyValue(i)
Next i
End Sub

Public Overrides Property Key() As Byte()
Get
Return CType(KeyValue.Clone(), Byte())
End Get
Set(ByVal Value As Byte())
If bHashing Then
Throw New Exception("Cannot change key during hash operation")
End If
If value.Length > 64 Then
KeyValue = hash1.ComputeHash(value)
' No need to call Initialize; ComputeHash does it automatically.
Else
KeyValue = CType(value.Clone(), Byte())
End If
' Compute rgbInner and rgbOuter.
Dim i As Integer = 0
For i = 0 To 63
rgbInner(i) = &H36
rgbOuter(i) = &H5C
Next i
For i = 0 To KeyValue.Length - 1
rgbInner(i) ^= KeyValue(i)
rgbOuter(i) ^= KeyValue(i)
Next i
End Set
End Property

Public Overrides Sub Initialize()
hash1.Initialize()
hash2.Initialize()
bHashing = False
End Sub

Protected Overrides Sub HashCore(ByVal rgb() As Byte, ByVal ib As Integer, ByVal cb As Integer)
If bHashing = False Then
hash1.TransformBlock(rgbInner, 0, 64, rgbInner, 0)
bHashing = True
End If
hash1.TransformBlock(rgb, ib, cb, rgb, ib)
End Sub

Protected Overrides Function HashFinal() As Byte()
If bHashing = False Then
hash1.TransformBlock(rgbInner, 0, 64, rgbInner, 0)
bHashing = True
End If
' Finalize the original hash.
hash1.TransformFinalBlock(New Byte(0) {}, 0, 0)
' Write the outer array.
hash2.TransformBlock(rgbOuter, 0, 64, rgbOuter, 0)
' Write the inner hash and finalize the hash.
hash2.TransformFinalBlock(hash1.Hash, 0, hash1.Hash.Length)
bHashing = False
Return hash2.Hash
End Function
End Class
``````

注釈

ハッシュ関数は、任意の長さのバイナリ文字列を固定長の小さなバイナリ文字列にマップします。 暗号ハッシュ関数には、同じ値にハッシュされる2つの異なる入力を見つけることができるというプロパティがあります。 データに小さな変更を加えると、ハッシュに大きな変更が加えられることがあります。

キー付きハッシュアルゴリズムは、メッセージ認証コードとして使用される、キーに依存する一方向のハッシュ関数です。 ハッシュを検証できるのは、そのキーを知っているユーザーだけです。 キー付きハッシュアルゴリズムは、機密性のない信頼性を提供します。

ハッシュ関数は、データの整合性を確保するために、よくデジタル署名と共に使用されます。 この HMACSHA1 クラスは、キー付きハッシュアルゴリズムの一例です。

SHA1 との競合問題のため、Microsoft では SHA256 以上に基づくセキュリティ モデルを推奨しています。

コンストラクター

 KeyedHashAlgorithm クラスの新しいインスタンスを初期化します。

フィールド

 計算されたハッシュ コードのサイズをビット単位で表します。 (継承元 HashAlgorithm) 計算されたハッシュ コードの値を表します。 (継承元 HashAlgorithm) ハッシュ アルゴリズムで使用するキー。 ハッシュ計算の状態を表します。 (継承元 HashAlgorithm)

プロパティ

 現在の変換を再利用できるかどうかを示す値を取得します。 (継承元 HashAlgorithm) 派生クラスでオーバーライドされると、複数のブロックを変換できるかどうかを示す値を取得します。 (継承元 HashAlgorithm) 計算されたハッシュ コードの値を取得します。 (継承元 HashAlgorithm) 計算されたハッシュ コードのサイズをビット単位で取得します。 (継承元 HashAlgorithm) 派生クラスでオーバーライドされると、入力ブロック サイズを取得します。 (継承元 HashAlgorithm) ハッシュ アルゴリズムで使用するキーを取得または設定します。 派生クラスでオーバーライドされると、出力ブロック サイズを取得します。 (継承元 HashAlgorithm)

メソッド

 HashAlgorithm クラスによって使用されているすべてのリソースを解放します。 (継承元 HashAlgorithm) 指定したバイト配列のハッシュ値を計算します。 (継承元 HashAlgorithm) 指定したバイト配列の指定した領域のハッシュ値を計算します。 (継承元 HashAlgorithm) 指定された Stream オブジェクトのハッシュ値を計算します。 (継承元 HashAlgorithm) 指定された Stream オブジェクトのハッシュ値を非同期に計算します。 (継承元 HashAlgorithm) 互換性のために残されています。 キー付きハッシュ アルゴリズムの既定の実装のインスタンスを作成します。 キー付きハッシュ アルゴリズムの指定した実装のインスタンスを作成します。 HashAlgorithm クラスの現在のインスタンスによって使用されているすべてのリソースを解放します。 (継承元 HashAlgorithm) KeyedHashAlgorithm によって使用されているアンマネージド リソースを解放し、オプションでマネージド リソースも解放します。 指定されたオブジェクトが現在のオブジェクトと等しいかどうかを判断します。 (継承元 Object) このメンバーは Finalize() をオーバーライドし、より詳細なドキュメントがそのトピックで使用できるようになる場合があります。 Object がガベージ コレクションにより収集される前に、その Object がリソースを解放し、その他のクリーンアップ操作を実行できるようにします。 既定のハッシュ関数として機能します。 (継承元 Object) 現在のインスタンスの Type を取得します。 (継承元 Object) 派生クラスでオーバーライドされると、ハッシュを計算するために、オブジェクトに書き込まれたデータをハッシュ アルゴリズムにルーティングします。 (継承元 HashAlgorithm) ハッシュを計算するために、オブジェクトに書き込んだデータをハッシュ アルゴリズムにルーティングします。 (継承元 HashAlgorithm) 派生クラスでオーバーライドされると、暗号化ハッシュ アルゴリズムによって最後のデータが処理された後に、ハッシュ計算を終了します。 (継承元 HashAlgorithm) ハッシュ アルゴリズムを初期状態にリセットします。 (継承元 HashAlgorithm) 現在の Object の簡易コピーを作成します。 (継承元 Object) 現在のオブジェクトを表す文字列を返します。 (継承元 Object) 入力バイト配列の指定した領域のハッシュ値を計算し、入力バイト配列の指定した領域を出力バイト配列の指定した領域にコピーします。 (継承元 HashAlgorithm) 指定したバイト配列の指定した領域のハッシュ値を計算します。 (継承元 HashAlgorithm) 指定したバイト配列のハッシュ値の計算を試みます。 (継承元 HashAlgorithm) ハッシュ アルゴリズムによって最後のデータが処理された後、ハッシュ計算の終了を試みます。 (継承元 HashAlgorithm)

明示的なインターフェイスの実装

 HashAlgorithm によって使用されているアンマネージド リソースを解放し、オプションでマネージド リソースも解放します。 (継承元 HashAlgorithm)