La forma correcta de ocultar las keys de API en Git

En mi proyecto de C # tengo el file APIKeys.cs que tiene cadenas const con keys API. Quiero que esas cadenas estén vacías en el server de Git pero que tengan keys API reales en mi computadora local. Entonces, los usuarios que extraen el proyecto pueden comstackrlo sin problemas y, sin embargo, mi computadora local tendrá keys API en el mismo file.

Si bash upload el file APIKeys.cs con cadenas vacías, entonces no puedo tener el file local con las keys API porque cuando bash presionarlo sobrescribirá el file vacío APIKeys.cs. Tampoco puedo ignorar este file porque eliminará el file APIKeys.cs vacío del server de Git.

Entonces, ¿cuál es el mejor enfoque automatizado para este problema que permitirá el file de class con cadenas vacías en el server (para que el proyecto se pueda comstackr cuando los pueblos lo extraigan) y el file de class real en la computadora local?

Acepte que no puede ocultar keys privadas sin cifrar en un espacio público.

Lo que puede hacer es mover las keys a un espacio privado y luego hacer reference a ese espacio privado desde el código.

Su espacio privado puede ser variables de entorno o el logging de Windows, debe ser algo que esté fuera del código fuente de su aplicación.

Otro enfoque es crear un nuevo file de configuration (por ejemplo, keys.config ) específicamente para almacenar keys privadas, y luego excluir este file del control de fuente.

Esto significa que no comparte sus keys privadas, pero también significa que necesita documentar (quizás en readme.md) que los usuarios tendrán que volver a crear sus propias keys.config . Aún mejor (gracias @Joey ) es include un file de configuration de muestra ( keys.sample.config ) en la solución, que ilustra lo que se necesita.

Aquí hay un ejemplo

Pensé en otra solución ahora que todavía no es perfecta, pero aún así lo suficientemente buena, por ejemplo:

Archivo APIKeys.cs:

 public static partial class APIKeys { public static string ImageShackKey = ""; public static string TinyPicID = ""; public static string TinyPicKey = ""; public static string ImgurClientID = ""; public static string ImgurClientSecret = ""; ... } 

Archivo APIKeysLocal.cs:

 public static partial class APIKeys { static APIKeys() { ImageShackKey = "asdf"; TinyPicID = "asdf"; TinyPicKey = "asdf"; ImgurClientID = "asdf"; ImgurClientSecret = "asdf"; ... } } 

Ignore el file APIKeysLocal.cs en Git y las personas que no tengan este file local aún podrán comstackr si lo eliminan del explorador de soluciones.

Tienes dos opciones:

  1. Dile a Git que ignore los cambios a APIKeys.cs en tu máquina local:

     git update-index --assume-unchanged APIKeys.cs 

    Esto provocará que los cambios locales no se comprometan. Si alguna vez desea realizar cambios en el file, tendrá que deshacer esto con el indicador --no-assume-unchanged .

  2. Cambie el nombre del file APIKeys.cs a algo como APIKeys.template.cs , que contiene las cadenas en blanco que desea compartir. Mantenga este file en su repository. Copie ese file a APIKeys.cs . Agregue APIKeys.cs a su .gitignore . Agregue instrucciones para copyr el file de plantilla y modifíquelo con la configuration local.

     git mv APIKeys.cs APIKeys.template.cs $EDITOR APIKeys.template.cs git commit cat APIKeys.cs >> .gitignore cp APIKeys.template.cs APIKeys.cs 

¿No es esto muy similar al problema de inyectar un número de compilation en tu componente? La forma en que lo hago es tener un paso previo a la compilation que genere un file llamado AssemblyVersionInfo.cs basado en alguna variable de entorno. Podrías hacer lo mismo con tus llaves API.

En el paso previo a la compilation para el componente que comstack en las keys de la API, escriba algo como esto:

 if not defined API_KEY set API_KEY=DEFAULT_KEY echo public class ApiKeys>"$(SolutionDir)src\ApiKeys.cs" echo {>>"$(SolutionDir)src\ApiKeys.cs" echo public const string Key="%API_KEY%";>>"$(SolutionDir)src\ApiKeys.cs" echo }>>"$(SolutionDir)src\ApiKeys.cs" 

Luego establece una variable de entorno de usuario o sistema en su máquina local con la key real en ella.

setx API_KEY THE_REAL_KEY

Para evitar que Git quiera confirmar el file, solo agrégalo al .gitignore.