En una aplicación normal de C# qué clase utilizar para el hash: xxxManaged
o xxx
(es decir, SHA1Managed
frente a SHA1
) y por qué?Cuál usar: algoritmos de hash administrados frente a no administrados
Respuesta
Los valores hash no gestionados que finalizan en ***Cng
, es decir, SHA256Cng, también tendrán restricciones de plataforma. Son bastante más rápidos que las alternativas administradas, pero fallarán en el tiempo de ejecución en Windows XP, por ejemplo. Sin embargo, si sabe que su programa siempre se ejecutará en Windows 7, Vista SP1 o 2008, generalmente funcionará bastante mejor que las versiones administradas, incluso con la sobrecarga de interoperabilidad nativa.
Si está escribiendo un programa de propósito general, las clases ***Managed
serán más fáciles de trabajar, ya que siempre funcionarán.
¿Estás seguro de que son más rápidos? – SLaks
@SLaks: en grandes trabajos hash, en mi caja, era casi 12 veces la velocidad de la versión administrada en mi última ejecución de creación de perfiles;) YMMV, por supuesto ... (Creo que la velocidad depende en gran medida del hardware + sistema operativo, sin embargo, ya que depende de si obtienes la aceleración de hardware). –
¿Son comunes los aceleradores de cifrado de hardware? Nunca he visto ninguno. – SLaks
Debe utilizar las variantes *Managed
; por lo general son más rápidos.
Las clases *CryptoProvider
y *CNG
usan interoperabilidad nativa, y suelen ser más lentas.
Sin embargo, he oído que pueden usar aceleradores criptográficos de hardware. (No lo he comprobado)
Además, las versiones nativas están certificadas por FIPS; las versiones administradas no son.
¿'SHA1.Create()' produce una variante administrada, o no hay garantías, y debe evitarse? E. –
@SLaks: personalmente siento que la certificación FIPS no es solo un "también", debería ser un punto de decisión en la parte superior del árbol de decisiones. Sin embargo, por mencionarlo, muy poca gente conoce esta pequeña advertencia :) –
@Martinho: Comprueba la configuración. El valor predeterminado es CSP (al menos en mi máquina) – SLaks
La biblioteca administrada es más segura de usar y no genera la sobrecarga PInvoke. También para aplicaciones de larga ejecución (ASP.NET) donde las pérdidas de memoria pueden acumularse para derribar el servidor, también es preferible administrarlas.
Las * versiones administradas se escriben utilizando el código administrado por completo, las * versiones del proveedor son un envoltorio alrededor de las API. Por lo tanto, si siempre usa las versiones administradas, su código será portátil, p. a Mono, pero si usa la versión de Proveedor, estará limitado a las plataformas de Windows.
Eso tiene sentido. – Xaqron
Las clases administradas son generalmente "más seguras" para usar en .NET; implementan interfaces definidas por Framework como IDisposable e ICryptoServiceProvider. Sin embargo, son un poco más lentos debido al componente administrado. Debería usar una clase administrada si necesita crear y destruir estos ayudantes a voluntad, y/o si necesita implementar patrones de diseño basados en interfaz.
Las clases no administradas son en general más rápidas (porque están compiladas previamente para el código de máquina), pero puede ser difícil trabajar con ellas. Destruir una instancia de una clase no administrada puede ser problemático y, a veces imposible. Debe usar estos si no hay un contenedor administrado que haga lo mismo (ya que es probable que termine implementando su propio contenedor para la clase no administrada para manejar la creación de instancias, la interoperabilidad y la destrucción), o si el uso es uno -apagado.
** Totalmente incorrecto **. Todos ellos heredan las mismas clases base y son totalmente intercambiables. Los no administrados no tienen problemas de interoperabilidad. – SLaks
Todos implementan IDisposable e ICryptoTransform, porque están en la clase base HashAlgorithm. E incluso si tuviera razón, las versiones no administradas serían las que necesitan IDisposable, no las administradas. Es por eso que están administrados. –
No estoy "totalmente equivocado"; Acabo de tomar "no administrado" para ser una clase COM o acceso externo en lugar de los contenedores .NET para el mismo. Si se proporciona en el.El marco NET es "administrado" en mi libro, ya sea un wrapper o una implementación 100% .NET del algoritmo. La mitad de las clases en el Framework son wrappers, y las llamamos clases "administradas". – KeithS
- 1. GC.AddMemoryPressure para objetos no administrados
- 2. CDI con objetos no administrados
- 3. Cómo usar @autowire en beans administrados jsf
- 4. Pasar punteros no administrados en C++/CLI
- 5. Fusionando .net dlls administrados
- 6. Subprocesos no administrados Spring Quartz Websphere Hibernate
- 7. Mover frijoles administrados JSF a Spring beans
- 8. ¿Debo llamar a Dispose() en objetos administrados?
- 9. Donde se asignan los recursos no administrados
- 10. ¿Dónde DLLImport busca archivos DLL no administrados?
- 11. ¿Qué son exactamente los recursos no administrados?
- 12. Motores polimórficos, en idiomas administrados?
- 13. Atributos de ensamblados de C++ administrados
- 14. Lenguajes de programación administrados de código abierto
- 15. Registre ensamblados administrados con COM sin usar el GAC
- 16. Crear servicio WCF para clientes C++ no administrados
- 17. ¿Por qué los beans administrados no se cargan en Tomcat?
- 18. Android: mediaplayer se fue con eventos no administrados
- 19. Uso de hilos y fibras administrados en CLR
- 20. Datos principales: crea varios objetos administrados, pero solo guarda algunos?
- 21. Obteniendo la lista de hilos actualmente activos administrados en .NET?
- 22. Android: evitar el bloqueo de la aplicación debido a errores no administrados
- 23. Parámetros opcionales en métodos administrados de C++/CLI
- 24. Encontrar todos los grupos administrados por un usuario
- 25. ¿Cuál es la forma correcta de crear varias instancias de beans administrados en JSF 2.0
- 26. ¿Cómo puedo usar el D3DImage de WPF con DirectX o XNA administrados?
- 27. ¿Los objetos COM dinámicos se consideran recursos administrados?
- 28. ¿Cuál es la diferencia entre los recursos administrados y los nativos al deshacerse? (.NET)
- 29. ¿Por qué no puedo ver una plantilla de archivo de clase de objetos administrados en Xcode?
- 30. ¿Por qué no puedo tener campos públicos estáticos en mis beans administrados?
Los algoritmos SHA1 no administrados están en SHA1Cng y SHA1CryptoServiceProvider. SHA1 es la clase base abstracta estos dos y SHA1 administrada. –