2016-01-27 1 views
3

Я делаю клиентское приложение для Windows 10. У меня есть проблема, когда я хочу открыть исходный код, но оставьте ключ API невидимым для других людей. Это соответствующая часть моего исходного файла:Как безопасно хранить учетные данные API в файле C#, совместно используемом в GitHub?

private const string ApiKey = "YOUR_API_KEY"; 

Я хотел бы, чтобы это превращается в

private const string ApiKey = "THE_ACTUAL_API_KEY"; 

при компиляции. Как мне это сделать?


редактировать: К сожалению для любых неясностей; Я спрашивал, как запретить зрителям исходный код GitHub видеть строку, не изменяя ее во время локальных сборок. Этот вопрос никак не связан с шифрованием.

+0

Вы прочитали о SecureString в C#? – TomTom

+1

@TomTom IMHO это не дубликат вопроса, который вы связали с ... –

+2

Кроме того, securestring на самом деле не является решением. Вы можете добавить только 1 символ в securestring, что потребует от вас его как строки в другом месте. – Mathijs

ответ

7

Вот как я решил решить проблему.

Я добавил класс к моему проекту под названием Credentials.cs:

public static class Credentials 
{ 
    public const string ApiKey = "YOUR_API_KEY"; 
} 

Все дальнейшие ссылки на ключ API были сделаны через поле я добавил. Например:

public void MakeRequest() 
{ 
    var client = new ApiClient(Credentials.ApiKey); 
    client.DoSomething(); 
} 

Теперь для магической части. После выполнения этого файла через Git я запустил git update-index --assume-unchanged Credentials.cs, который (согласно this SO answer) сообщает Git прекратить отслеживать изменения в файле. Другими словами, если вы измените файл и запустите git diff или git status, ничего не появится.

Затем я заменил YOUR_API_KEY фактическим ключом API в файле, и теперь все работает отлично.

+1

Я думал, что вопрос заключается в _safely_ его хранении. Ввод его в открытый текст ни в коем случае не «безопасен». Все, что вы делаете, просто оставляет незафиксированные изменения. –

+0

@JeffMercado Все, что мне нужно, это убедиться, что зрители исходного кода не видят его. Я не упоминал об шифровании/обфускации в моем оригинальном посте. –

2

Обычно я помещаю их в файл Web.config.Template.xml. Затем я положил свои реальные ключи в web.debug.config (например), и когда проект будет построен, я преобразую Web.config.Template.xml с web.debug.config и сбрасываю преобразование в web.config. Я использую NuGet пакет XmlTransformer и поставить эту строку в «prebuild» событие, чтобы выполнить это каждый раз, когда я построить проект: "$(SolutionDir)packages\XmlTransformer.1.1.0.4\lib\net40\XmlTransformer.exe" /s:"$(ProjectDir)Web.config.Template.xml" /t:"$(ProjectDir)Web.$(ConfigurationName).config" /d:"$(ProjectDir)Web.config" /k:Transform

Я никогда не совершаю web.config или web.debug.config к SC, только web.template.config

вот еще немного информация об конфигурационных преобразованиях: https://msdn.microsoft.com/en-us/library/dd465326(v=vs.110).aspx

+0

Я добавлю, что теперь есть расширение Visual Studio, которое позаботится о большей части этого для вас сейчас. Проверьте Fast Koala: https://marketplace.visualstudio.com/items?itemName=JonDaviswijitscom.FastKoala-WebAppconfigXMLtransforms – solidau

0

Вы не можете. Единственное решение - не должно храниться в вашем публичном реестре GitHub. Вы никогда не сможете позволить какой-либо непубличной части тайны быть ... публичной.

Решение этого вопроса заключается в том, что вы должны хранить секрет ближе к вашему хостингу. Вот пример того, как Azure Websites has built in secret protection легко интегрируется с непрерывным развертыванием. У других поставщиков облаков есть аналогичные конструкции, для того, чтобы сделать это самостоятельно, вы должны сделать это сами. Вы создаете шаг после сборки, который будет заменяться секретами из непубличного местоположения.

Отдельный вариант заключается в обслуживании частной вилки вашего публичного репо, содержащего ключ. Затем вы просто загружаете обновления из публичного репо на свой приватный.Но оптимально вы хотите сохранить ключи вне контроля источника.

Смежные вопросы