¿Cómo uso SHA1CryptoServiceProvider()
en un archivo para crear una suma de comprobación SHA1 del archivo?¿Cómo hago una suma de comprobación de archivo SHA1 en C#?
Respuesta
Con el método ComputeHash. Ver aquí:
fragmento de ejemplo:
using(var cryptoProvider = new SHA1CryptoServiceProvider())
{
string hash = BitConverter
.ToString(cryptoProvider.ComputeHash(buffer));
//do something with hash
}
Dónde buffer es el contenido de su archivo.
using (FileStream fs = new FileStream(@"C:\file\location", FileMode.Open))
using (BufferedStream bs = new BufferedStream(fs))
{
using (SHA1Managed sha1 = new SHA1Managed())
{
byte[] hash = sha1.ComputeHash(bs);
StringBuilder formatted = new StringBuilder(2 * hash.Length);
foreach (byte b in hash)
{
formatted.AppendFormat("{0:X2}", b);
}
}
}
formatted
contiene la representación de cadena del hash SHA-1. Además, al usar un FileStream
en lugar de un búfer de bytes, ComputeHash
calcula el hash en fragmentos, por lo que no tiene que cargar todo el archivo de una vez, lo que es útil para archivos de gran tamaño.
Debería usar un 'StringBuilder' en lugar de generar 20 cadenas en el proceso de compilación de la cadena hash. –
'FileStream' es' IDisposable' y también debe usarse en un bloque 'using'. –
La capacidad inicial de StringBuilder debe ser el doble de la cantidad de bytes en el hash –
Si ya está leyendo el archivo como una secuencia, la siguiente técnica calcula el hash a medida que lo lee. La única advertencia es que necesitas consumir toda la secuencia.
class Program
{
static void Main(string[] args)
{
String sourceFileName = "C:\\test.txt";
Byte[] shaHash;
//Use Sha1Managed if you really want sha1
using (var shaForStream = new SHA256Managed())
using (Stream sourceFileStream = File.Open(sourceFileName, FileMode.Open))
using (Stream sourceStream = new CryptoStream(sourceFileStream, shaForStream, CryptoStreamMode.Read))
{
//Do something with the sourceStream
//NOTE You need to read all the bytes, otherwise you'll get an exception ({"Hash must be finalized before the hash value is retrieved."})
while(sourceStream.ReadByte() != -1);
shaHash = shaForStream.Hash;
}
Console.WriteLine(Convert.ToBase64String(shaHash));
}
}
+1 para 'CryptoStream'. podría ser útil en caso de que desee leer un archivo de alguna parte (p. ej., de una solicitud http), escribirlo en algún lugar (p. ej .: en el disco) y, al mismo tiempo, calcular el hash. – tigrou
En una prueba en un archivo grande, este código realiza órdenes de magnitud peor que las soluciones 'ComputeHash'. ¿Tal vez es la lectura individual de "ReadByte"? –
@MichaelKropat interesante. Bueno saber. 10 veces, 100 veces más lento? –
También puede probar:
FileStream fop = File.OpenRead(@"C:\test.bin");
string chksum = BitConverter.ToString(System.Security.Cryptography.SHA1.Create().ComputeHash(fop));
- 1. reparación SVN suma de comprobación
- 2. ¿Cómo encontrar una suma de comprobación de la misma suma de comprobación? (pregunta de entrevista de trabajo)
- 3. Suma de comprobación en la cadena
- 4. Cómo calcular la suma de comprobación TCP
- 5. Calcule una suma de comprobación en el iPhone desde NSData
- 6. ¿Cómo calcular una suma de comprobación de paquete sin enviarlo?
- 7. ¿Cómo valido la suma de comprobación ICMPv6? (¿Por qué sigo recibiendo una suma de comprobación de 0x3fff?)
- 8. Cómo generar una suma de comprobación para un objeto java
- 9. Crear una suma de comprobación agregada de una columna
- 10. cálculo de suma de comprobación UDP
- 11. Python, suma de comprobación de un dict
- 12. Comprobación de un archivo vacío en C++
- 13. ¿Suma de comprobación para una matriz de enteros?
- 14. ¿Cómo puedo adivinar un algoritmo de suma de comprobación?
- 15. ¿Qué algoritmo de suma de comprobación debería usar?
- 16. ¿Cómo puedo desactivar la comprobación SHA1 de Ivy de los archivos .pom descargados?
- 17. ¿Cómo puedo adivinar un algoritmo de suma de comprobación?
- 18. Descomprimir un archivo en los informes de Solaris - tar: error de suma de comprobación de directorios
- 19. inválida archivo de firma SHA1
- 20. Obtener suma de comprobación MD5 para archivos muy grandes
- 21. Suma de comprobación fallida: Kerberos/Spring/Active Directory (2008)
- 22. Objetivo C: SHA1
- 23. Obtener suma de comprobación CRC de un NSData en Objective-C
- 24. ¿Cómo generar HMAC-SHA1 en C#?
- 25. Eficacia de detección de errores (CRC, suma de comprobación, etc.)
- 26. ¿Cómo hago ToString() una enumeración en C++?
- 27. ¿Cuál es la forma más limpia de obtener una suma de comprobación de una matriz multidimensional?
- 28. ¿Cuál es la forma más rápida de crear una suma de comprobación para archivos grandes en C#
- 29. Java 7 Kerberos Edición - AES128 suma de comprobación corrupto
- 30. Suma de comprobación de CRC con long (64 bit)
+1 para un gran consejo sobre el uso del 'BitConverter' para generar un hexágono-secuencia de una sola vez. –
SHA1CryptoServiceProvider debe estar envuelto en un bloque 'using' – Mike737
' BitConverter' separa bytes con un guion AA-F0-CC a diferencia de la solución de @ mgbowen. Puede o no ser lo que se desea. –