KeyedHashAlgorithm Klasa
Definicja
Ważne
Niektóre informacje odnoszą się do produktu w wersji wstępnej, który może zostać znacząco zmodyfikowany przed wydaniem. Firma Microsoft nie udziela żadnych gwarancji, jawnych lub domniemanych, w odniesieniu do informacji podanych w tym miejscu.
Reprezentuje klasę abstrakcyjną, z której muszą pochodzić wszystkie implementacje kluczowych algorytmów skrótu.
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
- Dziedziczenie
- Pochodne
- Atrybuty
Przykłady
W poniższym przykładzie kodu pokazano, jak pochodzić z KeyedHashAlgorithm klasy.
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
Uwagi
Funkcje skrótu mapować ciągi binarne dowolnej długości na małe ciągi binarne o stałej długości. Funkcja skrótu kryptograficznego ma właściwość, którą można obliczyć w celu znalezienia dwóch odrębnych danych wejściowych, które są skrótem do tej samej wartości. Niewielkie zmiany w danych powodują duże, nieprzewidywalne zmiany skrótu.
Algorytm skrótu klucza jest funkcją skrótu jednokierunkową używaną jako kod uwierzytelniania komunikatów. Tylko ktoś, kto zna klucz, może zweryfikować skrót. Algorytmy skrótów kluczy zapewniają autentyczność bez tajemnicy.
Funkcje skrótu są często używane z podpisami cyfrowymi i integralności danych. Klasa HMACSHA1 jest przykładem algorytmu skrótu klucza.
Ze względu na problemy z kolizją z algorytmem SHA1 firma Microsoft zaleca model zabezpieczeń oparty na algorytmie SHA256 lub lepszym.
Konstruktory
KeyedHashAlgorithm() |
Inicjuje nowe wystąpienie klasy KeyedHashAlgorithm. |
Pola
HashSizeValue |
Reprezentuje rozmiar w bitach obliczonego kodu skrótu. (Odziedziczone po HashAlgorithm) |
HashValue |
Reprezentuje wartość obliczonego kodu skrótu. (Odziedziczone po HashAlgorithm) |
KeyValue |
Klucz do użycia w algorytmie skrótu. |
State |
Reprezentuje stan obliczeń skrótu. (Odziedziczone po HashAlgorithm) |
Właściwości
CanReuseTransform |
Pobiera wartość wskazującą, czy można ponownie użyć bieżącego przekształcenia. (Odziedziczone po HashAlgorithm) |
CanTransformMultipleBlocks |
Po zastąpieniu w klasie pochodnej pobiera wartość wskazującą, czy można przekształcić wiele bloków. (Odziedziczone po HashAlgorithm) |
Hash |
Pobiera wartość obliczonego kodu skrótu. (Odziedziczone po HashAlgorithm) |
HashSize |
Pobiera rozmiar w bitach obliczonego kodu skrótu. (Odziedziczone po HashAlgorithm) |
InputBlockSize |
Po przesłonięciu w klasie pochodnej pobiera rozmiar bloku wejściowego. (Odziedziczone po HashAlgorithm) |
Key |
Pobiera lub ustawia klucz do użycia w algorytmie wyznaczania wartości skrótu. |
OutputBlockSize |
Po przesłonięciu w klasie pochodnej pobiera rozmiar bloku wyjściowego. (Odziedziczone po HashAlgorithm) |
Metody
Clear() |
Zwalnia wszystkie zasoby używane przez klasę HashAlgorithm . (Odziedziczone po HashAlgorithm) |
ComputeHash(Byte[]) |
Oblicza wartość skrótu dla określonej tablicy bajtów. (Odziedziczone po HashAlgorithm) |
ComputeHash(Byte[], Int32, Int32) |
Oblicza wartość skrótu dla określonego regionu określonej tablicy bajtów. (Odziedziczone po HashAlgorithm) |
ComputeHash(Stream) |
Oblicza wartość skrótu dla określonego Stream obiektu. (Odziedziczone po HashAlgorithm) |
ComputeHashAsync(Stream, CancellationToken) |
Asynchronicznie oblicza wartość skrótu dla określonego Stream obiektu. (Odziedziczone po HashAlgorithm) |
Create() |
Przestarzałe.
Przestarzałe.
Tworzy wystąpienie domyślnej implementacji algorytmu skrótu klucza. |
Create(String) |
Przestarzałe.
Tworzy wystąpienie określonej implementacji algorytmu skrótu klucza. |
Dispose() |
Zwalnia wszystkie zasoby używane przez bieżące wystąpienie klasy HashAlgorithm. (Odziedziczone po HashAlgorithm) |
Dispose(Boolean) |
Zwalnia zasoby niezarządzane używane przez element KeyedHashAlgorithm i opcjonalnie zwalnia zasoby zarządzane. |
Equals(Object) |
Określa, czy dany obiekt jest taki sam, jak bieżący obiekt. (Odziedziczone po Object) |
Finalize() |
Ten element członkowski przesłania element Finalize(), a dokładniejsza dokumentacja może być dostępna w tym temacie. Object Umożliwia próbę zwolnienia zasobów i wykonania innych operacji oczyszczania przed Object odzyskaniem przez odzyskiwanie pamięci. |
GetHashCode() |
Służy jako domyślna funkcja skrótu. (Odziedziczone po Object) |
GetType() |
Type Pobiera bieżące wystąpienie. (Odziedziczone po Object) |
HashCore(Byte[], Int32, Int32) |
Gdy zastąpisz klasę pochodną, przekierowuje dane zapisywane do obiektu w algorytmie skrótu na potrzeby obliczania skrótu. (Odziedziczone po HashAlgorithm) |
HashCore(ReadOnlySpan<Byte>) |
Kieruje dane zapisywane do obiektu w algorytmie skrótu na potrzeby obliczania skrótu. (Odziedziczone po HashAlgorithm) |
HashFinal() |
Po zastąpieniu w klasie pochodnej finalizuje obliczenia skrótu po przetworzeniu ostatnich danych przez algorytm skrótu kryptograficznego. (Odziedziczone po HashAlgorithm) |
Initialize() |
Resetuje algorytm skrótu do stanu początkowego. (Odziedziczone po HashAlgorithm) |
MemberwiseClone() |
Tworzy płytkią kopię bieżącego Objectelementu . (Odziedziczone po Object) |
ToString() |
Zwraca ciąg reprezentujący bieżący obiekt. (Odziedziczone po Object) |
TransformBlock(Byte[], Int32, Int32, Byte[], Int32) |
Oblicza wartość skrótu dla określonego regionu tablicy bajtów wejściowych i kopiuje określony region tablicy bajtów wejściowych do określonego regionu tablicy bajtów wyjściowych. (Odziedziczone po HashAlgorithm) |
TransformFinalBlock(Byte[], Int32, Int32) |
Oblicza wartość skrótu dla określonego regionu określonej tablicy bajtów. (Odziedziczone po HashAlgorithm) |
TryComputeHash(ReadOnlySpan<Byte>, Span<Byte>, Int32) |
Próbuje obliczyć wartość skrótu dla określonej tablicy bajtów. (Odziedziczone po HashAlgorithm) |
TryHashFinal(Span<Byte>, Int32) |
Próbuje sfinalizować obliczenia skrótu po przetworzeniu ostatnich danych przez algorytm skrótu. (Odziedziczone po HashAlgorithm) |
Jawne implementacje interfejsu
IDisposable.Dispose() |
Zwalnia zasoby niezarządzane używane przez element HashAlgorithm i opcjonalnie zwalnia zasoby zarządzane. (Odziedziczone po HashAlgorithm) |