2008-09-26 18 views
5

He escrito un ensamblaje que no quiero que otras personas puedan usar. Mi ensamblado está firmado con un archivo de clave de nombre fuerte, pero ¿cómo puedo asegurar el código para que solo los otros ensamblados firmados con la misma clave puedan llamar a los miembros en este ensamblaje?Asegurar un conjunto para que no pueda ser utilizado por un tercero

+0

posible duplicado de [¿Cómo evitar que otros utilicen mi ensamblado .Net?] (Http://stackoverflow.com/questions/96624/how-to-prevent-others-from-using- my-net-assembly) – Manishearth

Respuesta

12

Hay algunas opciones, ninguno muy eficaz, ya que no harán más que hacer las cosas un poquito más difíciles, pero no evitar que un usuario comprometido a evitar cualquier restricción:

En cada uno de sus puntos de entrada, se puede llamar a Assembly.GetCallingAssembly() y comparar el resultado con una lista de ensamblados que pueden llamar a su biblioteca, y lanzar una excepción de lo contrario.

Puede usar una herramienta como ilmerge para combinar sus ensamblajes en su aplicación principal y marcar todos los internos como privados. Combine con un ofuscador para proteger ligeramente mejor los resultados.

Pero asegurar un ensamblaje es tan sólido como asegurar una computadora donde el atacante tiene acceso físico: hay muy poco que puede hacer para proteger el contenido una vez que se le concede acceso físico.

0

Me parece un problema imposible. No puedes confiar en tu entorno Ese es un principio de computación fundamental y el motivo del cifrado de clave pública/privada.

3

es necesario agregar StrongNameIdentityPermissionAttributeattributes para exigir la seguridad

por ejemplo

[assembly:StrongNameIdentityPermissionAttribute(SecurityAction.RequestMinimum, 
PublicKey="00240000048000009400000006020000002400005253413100040000010001005" + 
"38a4a19382e9429cf516dcf1399facdccca092a06442efaf9ecaca33457be26ee0073c6bde5" + 
"1fe0873666a62459581669b510ae1e84bef6bcb1aff7957237279d8b7e0e25b71ad39df3684" + 
"5b7db60382c8eb73f289823578d33c09e48d0d2f90ed4541e1438008142ef714bfe604c41a4" + 
"957a4f6e6ab36b9715ec57625904c6")] 

ver esto msdn page para obtener más información

o lo hacen en Código Consulte this example

2

Yo sugeriría que se use el atributo LicenseProvider para asegurar el uso de su ensamblaje. Más información sobre el uso exacto está disponible here on MSDN

1

No estoy seguro si esta es la mejor opción, pero podría hacer que todas las clases "públicas" de su conjunto sean internas, y luego usar el atributo de nivel de ensamblaje [InternalsVisibleTo] para especificar explícitamente sus otras asambleas firmadas.

[assembly: InternalsVisibleTo('MyAssembly,Version=1.0.0.1, Culture=neutral,PublicKeyToken=..."); 

Here son los documentos de MSDN en el atributo.

+0

Trivialmente pasado por alto con la reflexión. – AviD

1

Al principio pensé que podría hacer sus miembros/clases en su ensamblado firmado privado y aplicar el nivel de ensamblaje InternalsVisibleTo attribute a sus otros ensamblajes. Supongo que esa reflexión te dejará atravesar eso sin embargo.

Tal vez el StrongNameIdentityPermission es lo que estás buscando.

Cuestiones relacionadas