c# - usuario - ¿Asegurar una contraseña en el código fuente?
passwordchar (10)
Tengo una contraseña en mi código que es necesaria para conectarse a un servidor sftp. ¿Cuál es la mejor manera de "ofuscar" u ocultarlo en el código?
Gracias
Cifrelo con algo fuerte como AES, pero como lo implica SLaks, su atacante puede aplicar ingeniería inversa al código y resolver el método y la clave de cifrado. Todo lo que está haciendo es agregar una capa que mantiene alejados a los script kiddies y un cierto nivel de atacante. Alguien que realmente quiera resolverlo, puede hacerlo. También podrían ejecutar su programa y ver qué contraseña se envía.
De hecho, considero que usar la función de "secciones protegidas" en App.Config o Web.Config es MENOS seguro que almacenar la contraseña en su código.
Cualquiera que tenga acceso al servidor puede descifrar esa sección de la configuración tan rápido como la encripta ejecutando el comando de descifrado descrito en el artículo que todos siguen citando:
aspnet_regiis -pd "connectionStrings" -app "/SampleApplication"
https://msdn.microsoft.com/en-us/library/zhhddkxy.aspx#Anchor_1
Así que esta característica de ASP.Net solo agrega seguridad en el caso de que un hacker haya tenido acceso a su web.config pero no a su servidor completo (sucedió en 2010 como se menciona en @djteller en el comentario del ataque de relleno de @djteller ). Pero si tienen acceso al servidor, estás expuesto en una llamada de cmd . Ni siquiera tienen que instalar ildasm.exe.
Sin embargo, almacenar contraseñas reales en su código es una pesadilla de mantenimiento. Una cosa que he visto es almacenar una contraseña cifrada en su web.config y almacenar la clave de cifrado en su código. Esto logra el objetivo de ocultar las contraseñas de la navegación casual mientras se puede mantener.
En este caso, un hacker tiene que al menos descompilar su código, encontrar su clave y luego descubrir qué algoritmo de cifrado está utilizando. No es imposible, pero sin duda es más difícil que ejecutar "aspnet_regiis -pd ...".
Mientras tanto, también estoy buscando mejores respuestas para esta pregunta de seis años ...
La mejor manera es no!
Fallando en eso:
Cifrado de secciones del archivo de configuración mediante la configuración protegida
No almacene su contraseña en su código fuente, guárdela en una sección protegida dentro de su App.Config (o Web.Config).
Consulte Secciones de cifrado de secciones del archivo de configuración mediante la configuración protegida en este documento de Microsoft.
Esto funciona mediante el cifrado de las claves de cifrado mediante las funciones integradas de Windows, bloqueadas en la dirección Mac y otras cosas no documentadas.
Esto incluso funcionará si está usando más de un servidor:
... si planea utilizar el mismo archivo de configuración cifrada en varios servidores, como una granja de servidores web, solo RsaProtectedConfigurationProvider le permite exportar las claves de cifrado utilizadas para cifrar los datos e importarlos en otro servidor.
Al usar esto, si alguien quisiera obtener su contraseña, primero tendría que romper la seguridad de Windows en su servidor (no es imposible, pero es más difícil que buscar en su IL la contraseña).
No guarde su contraseña en el código fuente.
Lea esto: http://en.wikipedia.org/wiki/Security_through_obscurity
No hay una buena manera.
Todo lo que puede hacer es usar un algoritmo inteligente para encriptar la contraseña.
Un ingeniero inverso con experiencia lograría descifrarlo.
No hay mucho que puedas hacer contra alguien que realmente quiere tu contraseña. Sin embargo, si esta no es una aplicación pública (aplicación interna de Intranet o algo así), simplemente puede encriptarla usando un algoritmo de cifrado simétrico o hacer algo como codificación de base 64. También podría ejecutar un ofuscador sobre su código para que sea menos obvio que hay una contraseña allí en alguna parte.
¿Tienes otra opción? El acceso crudo a SFTP es un poco peligroso, quizás puedas crear algún tipo de servicio de proxy intermedio, que solo permita las acciones específicas que tu aplicación requiera. Almacenar la contraseña para ese servicio en su código no es tan arriesgado como guardar su contraseña SFTP en su código.
No hay una "mejor manera" de almacenar la contraseña en el código fuente, ya que se puede recuperar de muchas maneras.
Puede oscurecer la cadena de contraseña o incluso cifrarla para evitar que se revele mediante una simple visualización, pero no puede tratarse como una protección seria.
No te molestes
Cualquier cosa que puedas hacer, tu atacante puede deshacer trivialmente.
Sin embargo, si solo necesita ejecutarse en una sola máquina, puede usar la clase ProtectedData
, que lo protegerá de forma segura contra cualquier persona que no esté en esa máquina y / o usuario.
En general, la única manera remotamente segura de hacerlo es almacenar la clave en una ubicación segura y separada.
Por ejemplo, puede cifrarlo usando un hash (no MD5) de una contraseña, luego solicite al usuario que ingrese la contraseña para que pueda obtener el hash. (El hash y la contraseña no se almacenarán en ningún lugar, debe hacer un hash separado para verificar la contraseña)
Puede ponerlo como un valor cifrado en el archivo web.config. No parece demasiado difícil: K scott Allen tutorial http://odetocode.com/blogs/scott/archive/2006/01/08/encrypting-custom-configuration-sections.aspx
Creo que hay una publicación de blog de Scott gu con enlaces a otra información. http://weblogs.asp.net/scottgu/archive/2006/01/09/434893.aspx
Puede usar algo como SLP Code Protector para bloquear la ingeniería inversa de sus ensamblajes. Aún así, estoy de acuerdo con todos los demás, no es la mejor idea.