У меня есть строка, в которой прописан ключ.
string key = "123s4d534s232sg342s3d432";
Хочу добавить на форму поле textBox, в котором при желании можно было бы ввести новый ключ.
Можно ли как-то осуществить смену ключа из приложения, когда информация о нем хранится только в exe-файле приложения?
Сам по себе 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
.
Да, можно. Если же ключ твоего приложения уникален и всегда имеет постоянную длину, тебе для этого не потребуется ничего: просто открой файл, найди свою строку и замени новой.
Если ты хочешь изменить сам себя, то прежде всего тебе понадобится снять блокировку на запись. Ты можешь либо воспользоваться функциями WinAPI
: попытаться снять существующую блокировку с файла, разрешив его модификацию; или, при запуске приложения, прочитать его данные в память после чего создать новый процесс из буфера в памяти. Придётся немножко почитать и погуглить.
Если же идти по пути наименьшего сопротивления, то достаточно при запуске сделать копию приложения во временном файле, запустить её ещё раз (передав в качестве параметров запуска путь к оригинальному файлу), после чего модифицировать его сколько душе угодно.
Только учти, что это production-ready решение. Во-первых, непонятно - какое поведение ты ожидаешь, если файл будет запущен несколько раз. Во-вторых, у тебя может просто не быть прав на запись - сетевые шары или просто ограничение в правах. Особенно с учётом того, что нормальные приложения так себя не ведут и больше всего ты будешь со стороны похож на вирус.
Значит, предлагаю ерундой не заниматься. Сохраняйте ключ в файл и шифруйте:
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);
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Делаю авторизацию в CMS XenforoСперва с помощью get-запроса получаю куки, а потом уже отправляю его в POST-запросе
Нужно, чтобы через определенное время бездействия пользователя возвращало в главное менюСейчас таймер выглядит так:
Приведу незатейливый код, демонстрирующий проблему:
Есть два desktop-приложения: launcher, который позволяет менять параметры второй программы, и cleaner, которой и передаются эти параметрыНеобходимо...