Consente di calcolare un codice HMAC (Hash-based Message Authentication Code) utilizzando la funzione hash SHA1.
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)
<ComVisibleAttribute(True)> _ Public Class HMACSHA1 _ Inherits HMAC
[ComVisibleAttribute(true)] public class HMACSHA1 : HMAC
[ComVisibleAttribute(true)] public ref class HMACSHA1 : public HMAC
[<ComVisibleAttribute(true)>] type HMACSHA1 = class inherit HMAC end
Il tipo HMACSHA1 espone i seguenti membri.
| Nome | Descrizione | |
|---|---|---|
|
HMACSHA1() | Consente di inizializzare una nuova istanza della classe HMACSHA1 con una chiave generata in modo casuale. |
|
HMACSHA1(Byte[]) | Inizializza una nuova istanza della classe HMACSHA1 con i dati della chiave specificata. |
|
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. |
| Nome | Descrizione | |
|---|---|---|
|
BlockSizeValue | Ottiene o imposta la dimensione del blocco da utilizzare nel valore hash. (Ereditato da HMAC) |
|
CanReuseTransform | Ottiene un valore che indica se è possibile riutilizzare la trasformazione corrente. (Ereditato da HashAlgorithm) |
|
CanTransformMultipleBlocks | Quando è sottoposta a override in una classe derivata, consente di ottenere un valore che indica se è possibile trasformare più blocchi. (Ereditato da HashAlgorithm) |
|
Hash | Ottiene il valore del codice hash calcolato. (Ereditato da HashAlgorithm) |
|
HashName | Ottiene o imposta il nome dell'algoritmo hash da utilizzare per la generazione di un hash. (Ereditato da HMAC) |
|
HashSize | Ottiene la dimensione in bit del codice hash calcolato. (Ereditato da HashAlgorithm) |
|
InputBlockSize | Quando è sottoposta a override in una classe derivata, consente di ottenere la dimensione del blocco di input. (Ereditato da HashAlgorithm) |
|
Key | Ottiene o imposta la chiave da utilizzare nell'algoritmo hash. (Ereditato da HMAC) |
|
OutputBlockSize | Quando è sottoposta a override in una classe derivata, consente di ottenere la dimensione del blocco di output. (Ereditato da HashAlgorithm) |
| Nome | Descrizione | |
|---|---|---|
|
Clear | Libera tutte le risorse utilizzate dalla classe HashAlgorithm. (Ereditato da HashAlgorithm) |
|
ComputeHash(Byte[]) | Consente di calcolare il valore hash della matrice di byte specificata. (Ereditato da HashAlgorithm) |
|
ComputeHash(Stream) | Calcola il valore hash per l'oggetto Stream specificato. (Ereditato da HashAlgorithm) |
|
ComputeHash(Byte[], Int32, Int32) | Consente di calcolare il valore hash dell'area specifica della matrice di byte specificata. (Ereditato da HashAlgorithm) |
|
Dispose() | Rilascia tutte le risorse utilizzate dall'istanza corrente della classe HashAlgorithm. (Ereditato da HashAlgorithm) |
|
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) |
|
Equals(Object) | Determina se l'oggetto Object specificato è uguale all'oggetto Object corrente. (Ereditato da Object) |
|
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) |
|
GetHashCode | Funge da funzione hash per un determinato tipo. (Ereditato da Object) |
|
GetType | Ottiene l'oggetto Type dell'istanza corrente. (Ereditato da Object) |
|
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) |
|
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) |
|
Initialize | Inizializza un'istanza dell'implementazione predefinita dell'oggetto HMAC. (Ereditato da HMAC) |
|
MemberwiseClone | Consente di creare una copia dei riferimenti dell'oggetto Object corrente. (Ereditato da Object) |
|
ToString | Restituisce una stringa che rappresenta l'oggetto corrente. (Ereditato da Object) |
|
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) |
|
TransformFinalBlock | Consente di calcolare il valore hash dell'area specifica della matrice di byte specificata. (Ereditato da HashAlgorithm) |
| Nome | Descrizione | |
|---|---|---|
|
HashSizeValue | Rappresenta la dimensione in bit del codice hash calcolato. (Ereditato da HashAlgorithm) |
|
HashValue | Rappresenta il valore del codice hash calcolato. (Ereditato da HashAlgorithm) |
|
KeyValue | Chiave da utilizzare nell'algoritmo hash. (Ereditato da KeyedHashAlgorithm) |
|
State | Rappresenta lo stato del calcolo hash. (Ereditato da HashAlgorithm) |
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.
Nell'esempio di codice riportato di seguito viene illustrato come firmare un file mediante l'oggetto HMACSHA1 e in seguito come verificarlo.
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
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
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
.NET Framework
Supportato in: 4, 3.5, 3.0, 2.0, 1.1, 1.0.NET Framework Client Profile
Supportato in: 4, 3.5 SP1Windows 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.
Riferimenti
Altre risorse
|
Data |
Cronologia |
Motivo |
|---|---|---|
|
Maggio 2011 |
Esempio di codice aggiornato. |
Miglioramento delle informazioni. |