Classe HMACSHA1 (System.Security.Cryptography)

Cambia visualizzazione:
ScriptFree
Riferimento a .NET Framework
Classe HMACSHA1
Il presente articolo è stato tradotto manualmente. Per visualizzare questa pagina e contemporaneamente visualizzarne il contenuto in lingua inglese, passare alla visualizzazione semplificata.

Consente di calcolare un codice HMAC (Hash-based Message Authentication Code) utilizzando la funzione hash SHA1.

Gerarchia di ereditarietà

System.Object
  System.Security.Cryptography.HashAlgorithm
    System.Security.Cryptography.KeyedHashAlgorithm
      System.Security.Cryptography.HMAC
        System.Security.Cryptography.HMACSHA1

Spazio dei nomi:  System.Security.Cryptography
Assembly:  mscorlib (in mscorlib.dll)
Sintassi

Visual Basic
<ComVisibleAttribute(True)> _
Public Class HMACSHA1 _
	Inherits HMAC
C#
[ComVisibleAttribute(true)]
public class HMACSHA1 : HMAC
Visual C++
[ComVisibleAttribute(true)]
public ref class HMACSHA1 : public HMAC
F#
[<ComVisibleAttribute(true)>]
type HMACSHA1 =  
    class
        inherit HMAC
    end

Il tipo HMACSHA1 espone i seguenti membri.

Costruttori

  Nome Descrizione
Metodo pubblico HMACSHA1() Consente di inizializzare una nuova istanza della classe HMACSHA1 con una chiave generata in modo casuale.
Metodo pubblico HMACSHA1(Byte[]) Inizializza una nuova istanza della classe HMACSHA1 con i dati della chiave specificata.
Metodo pubblico HMACSHA1(Byte[], Boolean) Inizializza una nuova istanza della classe HMACSHA1 con i dati della chiave specificata e un valore che indica se utilizzare la versione gestita dell'algoritmo SHA1.
In alto
Proprietà

  Nome Descrizione
Proprietà protetta. BlockSizeValue Ottiene o imposta la dimensione del blocco da utilizzare nel valore hash. (Ereditato da HMAC)
Proprietà pubblica CanReuseTransform Ottiene un valore che indica se è possibile riutilizzare la trasformazione corrente. (Ereditato da HashAlgorithm)
Proprietà pubblica CanTransformMultipleBlocks Quando è sottoposta a override in una classe derivata, consente di ottenere un valore che indica se è possibile trasformare più blocchi. (Ereditato da HashAlgorithm)
Proprietà pubblica Hash Ottiene il valore del codice hash calcolato. (Ereditato da HashAlgorithm)
Proprietà pubblica HashName Ottiene o imposta il nome dell'algoritmo hash da utilizzare per la generazione di un hash. (Ereditato da HMAC)
Proprietà pubblica HashSize Ottiene la dimensione in bit del codice hash calcolato. (Ereditato da HashAlgorithm)
Proprietà pubblica InputBlockSize Quando è sottoposta a override in una classe derivata, consente di ottenere la dimensione del blocco di input. (Ereditato da HashAlgorithm)
Proprietà pubblica Key Ottiene o imposta la chiave da utilizzare nell'algoritmo hash. (Ereditato da HMAC)
Proprietà pubblica OutputBlockSize Quando è sottoposta a override in una classe derivata, consente di ottenere la dimensione del blocco di output. (Ereditato da HashAlgorithm)
In alto
Metodi

  Nome Descrizione
Metodo pubblico Clear Libera tutte le risorse utilizzate dalla classe HashAlgorithm. (Ereditato da HashAlgorithm)
Metodo pubblico ComputeHash(Byte[]) Consente di calcolare il valore hash della matrice di byte specificata. (Ereditato da HashAlgorithm)
Metodo pubblico ComputeHash(Stream) Calcola il valore hash per l'oggetto Stream specificato. (Ereditato da HashAlgorithm)
Metodo pubblico ComputeHash(Byte[], Int32, Int32) Consente di calcolare il valore hash dell'area specifica della matrice di byte specificata. (Ereditato da HashAlgorithm)
Metodo pubblico Dispose() Rilascia tutte le risorse utilizzate dall'istanza corrente della classe HashAlgorithm. (Ereditato da HashAlgorithm)
Metodo protetto Dispose(Boolean) Libera le risorse non gestite utilizzate dalla classe HMAC quando è lecito lo scambio delle chiavi ed eventualmente libera le risorse gestite. (Ereditato da HMAC)
Metodo pubblico Equals(Object) Determina se l'oggetto Object specificato è uguale all'oggetto Object corrente. (Ereditato da Object)
Metodo protetto Finalize Consente a un oggetto di provare a liberare risorse ed eseguire altre operazioni di pulitura prima che l'oggetto stesso venga recuperato dalla procedura di Garbage Collection. (Ereditato da Object)
Metodo pubblico GetHashCode Funge da funzione hash per un determinato tipo. (Ereditato da Object)
Metodo pubblico GetType Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object)
Metodo protetto HashCore Quando è sottoposto a override in una classe derivata, consente di indirizzare i dati scritti nell'oggetto verso l'algoritmo hash HMAC predefinito per il calcolo del valore hash. (Ereditato da HMAC)
Metodo protetto HashFinal Quando è sottoposto a override in una classe derivata, consente di finalizzare il calcolo hash una volta che gli ultimi dati sono stati elaborati dall'oggetto flusso crittografato. (Ereditato da HMAC)
Metodo pubblico Initialize Inizializza un'istanza dell'implementazione predefinita dell'oggetto HMAC. (Ereditato da HMAC)
Metodo protetto MemberwiseClone Consente di creare una copia dei riferimenti dell'oggetto Object corrente. (Ereditato da Object)
Metodo pubblico ToString Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object)
Metodo pubblico TransformBlock Consente di calcolare il valore hash dell'area specifica della matrice di byte di input e di copiare una determinata area della matrice di byte di input nell'area specifica della matrice di byte di output. (Ereditato da HashAlgorithm)
Metodo pubblico TransformFinalBlock Consente di calcolare il valore hash dell'area specifica della matrice di byte specificata. (Ereditato da HashAlgorithm)
In alto
Campi

  Nome Descrizione
Campo protetto HashSizeValue Rappresenta la dimensione in bit del codice hash calcolato. (Ereditato da HashAlgorithm)
Campo protetto HashValue Rappresenta il valore del codice hash calcolato. (Ereditato da HashAlgorithm)
Campo protetto KeyValue Chiave da utilizzare nell'algoritmo hash. (Ereditato da KeyedHashAlgorithm)
Campo protetto State Rappresenta lo stato del calcolo hash. (Ereditato da HashAlgorithm)
In alto
Note

L'oggetto HMACSHA1 è un tipo di algoritmo hash con chiave costruito dalla funzione hash SHA1 e utilizzato come codice HMAC (Hash-based Message Authentication Code). Nel processo HMAC viene combinata una chiave segreta ai dati del messaggio, viene generato un hash per il risultato, viene combinato il valore hash alla chiave segreta e viene nuovamente applicata la funzione hash. L'hash risultante è di lunghezza pari a 160 bit.

Il codice HMAC può essere utilizzato per determinare se un messaggio ricevuto attraverso un canale non protetto è stato alterato, a condizione che il mittente e il destinatario condividano una chiave segreta. Il mittente calcola il valore hash per i dati originali e invia i dati originali e il valore hash in un solo messaggio. Il destinatario ricalcola il valore hash sul messaggio ricevuto e verifica che il codice HMAC calcolato corrisponda a quello trasmesso.

Qualsiasi modifica ai dati o al valore hash causerà un'errata corrispondenza, perché è necessario conoscere la chiave segreta per modificare il messaggio e riprodurre il valore hash corretto. Pertanto, se i valori hash originale e calcolato corrispondono, il messaggio viene autenticato.

SHA-1 (Secure Hash Algorithm, anche denominato SHS, Secure Hash Standard) è un algoritmo hash di crittografia pubblicato dal Governo degli Stati Uniti. Produce un valore hash di 160 bit da una stringa di lunghezza arbitraria.

L'oggetto HMACSHA1 accetta chiavi di qualsiasi dimensione e produce una sequenza hash di 160 bit di lunghezza.

Esempi

Nell'esempio di codice riportato di seguito viene illustrato come firmare un file mediante l'oggetto HMACSHA1 e in seguito come verificarlo.

Visual Basic

Imports System
Imports System.IO
Imports System.Security.Cryptography



Public Class HMACSHA1example

    ' Computes a keyed hash for a source file, creates a target file with the keyed hash
    ' prepended to the contents of the source file, then decrypts the file and compares
    ' the source and the decrypted files.
    Public Shared Sub EncodeFile(ByVal key() As Byte, ByVal sourceFile As String, ByVal destFile As String)
        ' Initialize the keyed hash object.
        Dim myhmacsha1 As New HMACSHA1(key)
        Dim inStream As New FileStream(sourceFile, FileMode.Open)
        Dim outStream As New FileStream(destFile, FileMode.Create)
        ' Compute the hash of the input file.
        Dim hashValue As Byte() = myhmacsha1.ComputeHash(inStream)
        ' Reset inStream to the beginning of the file.
        inStream.Position = 0
        ' Write the computed hash value to the output file.
        outStream.Write(hashValue, 0, hashValue.Length)
        ' Copy the contents of the sourceFile to the destFile.
        Dim bytesRead As Integer
        ' read 1K at a time
        Dim buffer(1023) As Byte
        Do
            ' Read from the wrapping CryptoStream.
            bytesRead = inStream.Read(buffer, 0, 1024)
            outStream.Write(buffer, 0, bytesRead)
        Loop While bytesRead > 0
        myhmacsha1.Clear()
        ' Close the streams
        inStream.Close()
        outStream.Close()
        Return

    End Sub


    ' Decrypt the encoded file and compare to original file.
    Public Shared Function DecodeFile(ByVal key() As Byte, ByVal sourceFile As String) As Boolean
        ' Initialize the keyed hash object. 
        Dim hmacsha1 As New HMACSHA1(key)
        ' Create an array to hold the keyed hash value read from the file.
        Dim storedHash(hmacsha1.HashSize / 8) As Byte
        ' Create a FileStream for the source file.
        Dim inStream As New FileStream(sourceFile, FileMode.Open)
        ' Read in the storedHash.
        inStream.Read(storedHash, 0, storedHash.Length)
        ' Compute the hash of the remaining contents of the file.
        ' The stream is properly positioned at the beginning of the content, 
        ' immediately after the stored hash value.
        Dim computedHash As Byte() = hmacsha1.ComputeHash(inStream)
        ' compare the computed hash with the stored value
        Dim err As Boolean = False
        Dim i As Integer
        For i = 0 To storedHash.Length
            If computedHash(i) <> storedHash(i) Then
                Console.WriteLine("Hash values differ! Encoded file has been tampered with!")
                Return False
            End If
        Next i
        If (err) Then
            Console.WriteLine("Hash values differ! Encoded file has been tampered with!")
            Return False
        Else
            Console.WriteLine("Hash values agree -- no tampering occurred.")
            Return True
        End If
    End Function
    Private Const usageText As String = "Usage: HMACSHA1 inputfile.txt encryptedfile.hsh" + vbLf + "You must specify the two file names. Only the first file must exist." + vbLf

    Public Shared Sub Main(ByVal Fileargs() As String)
        'If no file names are specified, write usage text.
        If Fileargs.Length < 2 Then
            Console.WriteLine(usageText)
        Else
            Try
                ' Create a random key using a random number generator. This would be the
                '  secret key shared by sender and receiver.
                Dim secretkey() As Byte = New [Byte](63) {}
                'RNGCryptoServiceProvider is an implementation of a random number generator.
                Dim rng As New RNGCryptoServiceProvider()
                ' The array is now filled with cryptographically strong random bytes.
                rng.GetBytes(secretkey)

                ' Use the secret key to encode the message file.
                EncodeFile(secretkey, Fileargs(0), Fileargs(1))

                ' Take the encoded file and decode
                DecodeFile(secretkey, Fileargs(1))
            Catch e As IOException
                Console.WriteLine("Error: File not found", e)
            End Try
        End If

    End Sub
End Class



C#

using System;
using System.IO;
using System.Security.Cryptography;

public class HMACSHA1example
{
	// Computes a keyed hash for a source file, creates a target file with the keyed hash
	// prepended to the contents of the source file, then decrypts the file and compares
	// the source and the decrypted files.
	public static void EncodeFile(byte[] key, String sourceFile, String destFile)
	{
		// Initialize the keyed hash object.
		HMACSHA1 myhmacsha1 = new HMACSHA1(key);
		FileStream inStream = new FileStream(sourceFile, FileMode.Open);
		FileStream outStream = new FileStream(destFile, FileMode.Create);
		// Compute the hash of the input file.
		byte[] hashValue = myhmacsha1.ComputeHash(inStream);
		// Reset inStream to the beginning of the file.
		inStream.Position = 0;
		// Write the computed hash value to the output file.
		outStream.Write(hashValue, 0, hashValue.Length);
		// Copy the contents of the sourceFile to the destFile.
		int bytesRead;
		// read 1K at a time
		byte[] buffer = new byte[1024]; 
		do
		{
			// Read from the wrapping CryptoStream.
			bytesRead = inStream.Read(buffer,0,1024); 
			outStream.Write(buffer, 0, bytesRead);
		} while (bytesRead > 0); 
		myhmacsha1.Clear();
		// Close the streams
		inStream.Close();
		outStream.Close();
		return;
	} // end EncodeFile


	// Decrypt the encoded file and compare to original file.
	public static bool DecodeFile(byte[] key, String sourceFile)
	{
		// Initialize the keyed hash object. 
		HMACSHA1 hmacsha1 = new HMACSHA1(key);
		// Create an array to hold the keyed hash value read from the file.
		byte[] storedHash = new byte[hmacsha1.HashSize/8];
		// Create a FileStream for the source file.
		FileStream inStream = new FileStream(sourceFile, FileMode.Open);
		// Read in the storedHash.
		inStream.Read(storedHash, 0, storedHash.Length);
		// Compute the hash of the remaining contents of the file.
		// The stream is properly positioned at the beginning of the content, 
		// immediately after the stored hash value.
		byte[] computedHash = hmacsha1.ComputeHash(inStream);
		// compare the computed hash with the stored value
        bool err = false;
        for (int i = 0; i < storedHash.Length; i++)
        {
            if (computedHash[i] != storedHash[i])
            {
                err = true;
            }
        }
        if (err)
        {
            Console.WriteLine("Hash values differ! Encoded file has been tampered with!");
            return false;
        }
        else
        {
            Console.WriteLine("Hash values agree -- no tampering occurred.");
            return true;
        }
	} //end DecodeFile

	private const string usageText = "Usage: HMACSHA1 inputfile.txt encryptedfile.hsh\nYou must specify the two file names. Only the first file must exist.\n";
	public static void Main(string[] Fileargs)
	{
		//If no file names are specified, write usage text.
		if (Fileargs.Length < 2)
		{
			Console.WriteLine(usageText);
		}
		else
		{
			try
			{
				// Create a random key using a random number generator. This would be the
				//  secret key shared by sender and receiver.
				byte[] secretkey = new Byte[64];
				//RNGCryptoServiceProvider is an implementation of a random number generator.
				RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
				// The array is now filled with cryptographically strong random bytes.
				rng.GetBytes(secretkey); 

				// Use the secret key to encode the message file.
				EncodeFile(secretkey, Fileargs[0], Fileargs[1]);

				// Take the encoded file and decode
				DecodeFile(secretkey, Fileargs[1]);
			}
			catch (IOException e)
			{
				Console.WriteLine("Error: File not found",e);
			}
		} //end if-else

	}  //end main
} //end class


Visual C++

using namespace System;
using namespace System::IO;
using namespace System::Security::Cryptography;

// Computes a keyed hash for a source file, creates a target file with the keyed hash
// prepended to the contents of the source file, then decrypts the file and compares
// the source and the decrypted files.
void EncodeFile( array<Byte>^key, String^ sourceFile, String^ destFile )
{

   // Initialize the keyed hash object.
   HMACSHA1^ myhmacsha1 = gcnew HMACSHA1( key );
   FileStream^ inStream = gcnew FileStream( sourceFile,FileMode::Open );
   FileStream^ outStream = gcnew FileStream( destFile,FileMode::Create );

   // Compute the hash of the input file.
   array<Byte>^hashValue = myhmacsha1->ComputeHash( inStream );

   // Reset inStream to the beginning of the file.
   inStream->Position = 0;

   // Write the computed hash value to the output file.
   outStream->Write( hashValue, 0, hashValue->Length );

   // Copy the contents of the sourceFile to the destFile.
   int bytesRead;

   // read 1K at a time
   array<Byte>^buffer = gcnew array<Byte>(1024);
   do
   {

      // Read from the wrapping CryptoStream.
      bytesRead = inStream->Read( buffer, 0, 1024 );
      outStream->Write( buffer, 0, bytesRead );
   }
   while ( bytesRead > 0 );

   myhmacsha1->Clear();

   // Close the streams
   inStream->Close();
   outStream->Close();
   return;
} // end EncodeFile



// Decrypt the encoded file and compare to original file.
bool DecodeFile( array<Byte>^key, String^ sourceFile )
{

   // Initialize the keyed hash object. 
   HMACSHA1^ hmacsha1 = gcnew HMACSHA1( key );

   // Create an array to hold the keyed hash value read from the file.
   array<Byte>^storedHash = gcnew array<Byte>(hmacsha1->HashSize / 8);

   // Create a FileStream for the source file.
   FileStream^ inStream = gcnew FileStream( sourceFile,FileMode::Open );

   // Read in the storedHash.
   inStream->Read( storedHash, 0, storedHash->Length );

   // Compute the hash of the remaining contents of the file.
   // The stream is properly positioned at the beginning of the content, 
   // immediately after the stored hash value.
   array<Byte>^computedHash = hmacsha1->ComputeHash( inStream );

   // compare the computed hash with the stored value
   bool err = false;
   for ( int i = 0; i < storedHash->Length; i++ )
   {
      if ( computedHash[ i ] != storedHash[ i ] )
      {
         err = true;
      }
   }
   if (err)
        {
            Console::WriteLine("Hash values differ! Encoded file has been tampered with!");
            return false;
        }
        else
        {
            Console::WriteLine("Hash values agree -- no tampering occurred.");
            return true;
        }

} //end DecodeFile


int main()
{
   array<String^>^Fileargs = Environment::GetCommandLineArgs();
   String^ usageText = "Usage: HMACSHA1 inputfile.txt encryptedfile.hsh\nYou must specify the two file names. Only the first file must exist.\n";

   //If no file names are specified, write usage text.
   if ( Fileargs->Length < 3 )
   {
      Console::WriteLine( usageText );
   }
   else
   {
      try
      {

         // Create a random key using a random number generator. This would be the
         //  secret key shared by sender and receiver.
         array<Byte>^secretkey = gcnew array<Byte>(64);

         //RNGCryptoServiceProvider is an implementation of a random number generator.
         RNGCryptoServiceProvider^ rng = gcnew RNGCryptoServiceProvider;

         // The array is now filled with cryptographically strong random bytes.
         rng->GetBytes( secretkey );

         // Use the secret key to encode the message file.
         EncodeFile( secretkey, Fileargs[ 1 ], Fileargs[ 2 ] );

         // Take the encoded file and decode
         DecodeFile( secretkey, Fileargs[ 2 ] );
      }
      catch ( IOException^ e ) 
      {
         Console::WriteLine( "Error: File not found", e );
      }

   }
} //end main




Informazioni sulla versione

.NET Framework

Supportato in: 4, 3.5, 3.0, 2.0, 1.1, 1.0

.NET Framework Client Profile

Supportato in: 4, 3.5 SP1
Piattaforme

Windows 7, Windows Vista SP1 o versione successiva, Windows XP SP3, Windows XP SP2 x64 Edition, Windows Server 2008 (componenti di base del server non supportati), Windows Server 2008 R2 (componenti di base del server supportati con SP1 o versione successiva), Windows Server 2003 SP2

.NET Framework non supporta tutte le versioni di ciascuna piattaforma. Per un elenco delle versioni supportate, vedere Requisiti di sistema di .NET Framework.
Codice thread safe

Qualsiasi membro static (Shared in Visual Basic) pubblico di questo tipo è thread-safe. I membri di istanza non sono garantiti come thread-safe.
Vedere anche

Riferimenti

Altre risorse

Cronologia delle modifiche

Data

Cronologia

Motivo

Maggio 2011

Esempio di codice aggiornato.

Miglioramento delle informazioni.