2011-03-17 10 views

Respuesta

10

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.

+0

¿Estás seguro de que son más rápidos? – SLaks

+2

@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). –

+0

¿Son comunes los aceleradores de cifrado de hardware? Nunca he visto ninguno. – SLaks

7

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.

+0

¿'SHA1.Create()' produce una variante administrada, o no hay garantías, y debe evitarse? E. –

+0

@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 :) –

+0

@Martinho: Comprueba la configuración. El valor predeterminado es CSP (al menos en mi máquina) – SLaks

0

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.

1

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.

+0

Eso tiene sentido. – Xaqron

0

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.

+4

** Totalmente incorrecto **. Todos ellos heredan las mismas clases base y son totalmente intercambiables. Los no administrados no tienen problemas de interoperabilidad. – SLaks

+3

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. –

+0

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

Cuestiones relacionadas