C# смена ключа в приложении

317
13 августа 2017, 04:33

У меня есть строка, в которой прописан ключ.

string key = "123s4d534s232sg342s3d432";

Хочу добавить на форму поле textBox, в котором при желании можно было бы ввести новый ключ.

Можно ли как-то осуществить смену ключа из приложения, когда информация о нем хранится только в exe-файле приложения?

Answer 1

Сам по себе exe-файл представляет собой готовый, скомпилированный исполняемый файл. Менять его содержимое без повторной компиляции не представляется возможным, насколько мне известно.
В данной ситуации я бы посоветовал использовать стандартный файл параметров приложения Settings.Settings. Для этого:
1) Открываем Settings.Settings в Visual Studio, добавляем новую строку с параметрами: имя - key, тип - string, область - пользователь.
2) Кидаем на форму textbox и button.
3) textbox маскируем под ввод ключа (по-желанию), в методе button_Click пишем следующее:

Properties.Settings.Default.key = textbox.text;  
Properties.Settings.Default.Save();  

Отныне в этом свойстве можно всегда достать ваш key.

Answer 2

Да, можно. Если же ключ твоего приложения уникален и всегда имеет постоянную длину, тебе для этого не потребуется ничего: просто открой файл, найди свою строку и замени новой. Если ты хочешь изменить сам себя, то прежде всего тебе понадобится снять блокировку на запись. Ты можешь либо воспользоваться функциями WinAPI: попытаться снять существующую блокировку с файла, разрешив его модификацию; или, при запуске приложения, прочитать его данные в память после чего создать новый процесс из буфера в памяти. Придётся немножко почитать и погуглить. Если же идти по пути наименьшего сопротивления, то достаточно при запуске сделать копию приложения во временном файле, запустить её ещё раз (передав в качестве параметров запуска путь к оригинальному файлу), после чего модифицировать его сколько душе угодно.

Только учти, что это production-ready решение. Во-первых, непонятно - какое поведение ты ожидаешь, если файл будет запущен несколько раз. Во-вторых, у тебя может просто не быть прав на запись - сетевые шары или просто ограничение в правах. Особенно с учётом того, что нормальные приложения так себя не ведут и больше всего ты будешь со стороны похож на вирус.

Answer 3

Значит, предлагаю ерундой не заниматься. Сохраняйте ключ в файл и шифруйте:

var rijndael = Rijndael.Create();
// Save this values or not use Rijndael and set values manually:
byte[] key = rijndael.Key;
byte[] iv = rijndael.IV;
// Save key.
string keyString = "KEY STRING";
File.WriteAllBytes("My Important file.dat", AesEncrypt(Encoding.Unicode.GetBytes(keyString), key, iv));
// Read key.
string readed = Encoding.Unicode.GetString(AesDecrypt(File.ReadAllBytes("My Important file.dat"), key, iv));
 MessageBox.Show(readed);

Методы шифрования (вообще, если будете часто шифровать/расшифровывать данные, для оптимизации проводите инициализацию переменных aesAlgEncryptor, aesAlgDecryptor, encryptor и decryptor один раз (т.е. можно, например, вынести их из области функции в класс, и задать как null, а инициализировать только 1 раз - когда они, как раз, nullable)):

byte[] AesEncrypt(byte[] data, byte[] key, byte[] iv) {
    var aesAlgEncrypt = Aes.Create();
    aesAlgEncrypt.Key = key;
    aesAlgEncrypt.IV = iv;
    var encryptor = aesAlgEncrypt.CreateEncryptor(aesAlgEncrypt.Key, aesAlgEncrypt.IV);
    using (var msEncrypt = new MemoryStream()) {
        using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write)) {
            csEncrypt.Write(data, 0, data.Length);
            csEncrypt.FlushFinalBlock();
            csEncrypt.Close();
            return msEncrypt.ToArray();
        }
    }
}
byte[] AesDecrypt(byte[] data, byte[] key, byte[] iv) {
    var aesAlgDecrypt = Aes.Create();
    aesAlgDecrypt.Key = key;
    aesAlgDecrypt.IV = iv;
    var decryptor = aesAlgDecrypt.CreateDecryptor(aesAlgDecrypt.Key, aesAlgDecrypt.IV);
    using (var csDecrypt = new CryptoStream(new MemoryStream(data), decryptor, CryptoStreamMode.Read)) {
       using (var smDecrypt = new MemoryStream()) {
            csDecrypt.Flush();
            csDecrypt.CopyTo(smDecrypt);
            csDecrypt.Close();
            return smDecrypt.ToArray();
        }
    }
}

Так же, как предложено в ответе выше, можете использовать настройки (на деле (уже писал, кстати) эти настройки будут сохранены в формате XML в файл где-то в AppData текущего пользователя):

(установите Scope как Application, если всё таки не будете менять значение)

Properties.Settings.Default.key = "New value";
Properties.Settings.Default.Save();
MessageBox.Show(Properties.Settings.Default.key);
READ ALSO
Cookie не добавляются в POST-запрос

Cookie не добавляются в POST-запрос

Делаю авторизацию в CMS XenforoСперва с помощью get-запроса получаю куки, а потом уже отправляю его в POST-запросе

319
Создать таймер в Xamarin Android

Создать таймер в Xamarin Android

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

283
WPF Ухудшение качества текста при наличии BlurShadowEffect у родителя

WPF Ухудшение качества текста при наличии BlurShadowEffect у родителя

Приведу незатейливый код, демонстрирующий проблему:

310
Запуск desktop-приложения с передаваемыми параметрами

Запуск desktop-приложения с передаваемыми параметрами

Есть два desktop-приложения: launcher, который позволяет менять параметры второй программы, и cleaner, которой и передаются эти параметрыНеобходимо...

260