Защита паролем текстового файла, который не зашифрован, на самом деле невозможен. Однако вы можете проверить, был ли изменен ваш текстовый файл, чтобы вы знали, что он был изменен кем-то.
Концепция проста. Используйте пароль для шифрования или обфускации хэша данных (текстового файла). Вы можете позже проверить этот хэш на текущие данные и определить, соответствует ли он. Вам нужно будет хранить эту подпись (зашифрованный хэш) где-то, возможно, в файле с именем (textfile.sig).
Вы можете использовать класс SHA1Managed .NET для создания хэша и класса TripleDESCryptoServiceProvider для шифрования полученного хэша.
что-то вроде ...
public string GetSignature(string text, string password)
{
byte[] key;
byte[] key2;
GetKeys(password, out key, out key2);
string sig = encryptstring(GetSHA1(text), key, key2);
}
public void GetKeys(string password, out byte[] key, out byte[] key2)
{
byte[] data = StringToByte(password);
SHA1 sha = new SHA1CryptoServiceProvider();
MD5 md5 = new MD5CryptoServiceProvider();
byte[] hash1 = sha.ComputeHash(data);
byte[] hash2 = md5.ComputeHash(data);
// Generate some key data based on the supplied password;
byte[] key = new byte[24];
for (int i = 0; i < 20; i++)
{
key[i] = hash1[i];
}
for (int i = 0; i < 4; i++)
{
key[i + 20] = hash2[i];
}
byte[] key2 = new byte[8];
for (int i = 0; i < 8; i++)
{
key2[i] = hash2[i+4];
}
}
public string GetSHA1(string text)
{
UnicodeEncoding UE = new UnicodeEncoding();
byte[] hashValue;
byte[] message = UE.GetBytes(text);
SHA1Managed hashString = new SHA1Managed();
string hex = "";
hashValue = hashString.ComputeHash(message);
foreach (byte x in hashValue)
{
hex += String.Format("{0:x2}", x);
}
return hex;
}
public string ByteToString(byte[] buff)
{
string sbinary = "";
for (int i = 0; i < buff.Length; i++)
{
sbinary += buff[i].ToString("X2"); // hex format
}
return (sbinary);
}
public string encryptstring(string instr, byte[] key, byte[] key2)
{
TripleDES threedes = new TripleDESCryptoServiceProvider();
threedes.Key = key;
threedes.IV = key2;
ICryptoTransform encryptor = threedes.CreateEncryptor(key, key2);
MemoryStream msEncrypt = new MemoryStream();
CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write);
// Write all data to the crypto stream and flush it.
csEncrypt.Write(StringToByte(instr), 0, StringToByte(instr).Length);
csEncrypt.FlushFinalBlock();
return ByteToString(msEncrypt.ToArray());
}
public string decryptstring(string instr, byte[] key, byte[] key2)
{
if (string.IsNullOrEmpty(instr)) return "";
TripleDES threedes = new TripleDESCryptoServiceProvider();
threedes.Key = key;
threedes.IV = key2;
ICryptoTransform decryptor = threedes.CreateDecryptor(key, key2);
// Now decrypt the previously encrypted message using the decryptor
MemoryStream msDecrypt = new MemoryStream(HexStringToByte(instr));
CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read);
try
{
return ByteToString(csDecrypt);
}
catch (CryptographicException)
{
return "";
}
}
В противном случае, вы будете, если вы хотите скрыть данные от людей, необходимо зашифровать данные в текстовом файле. Вы можете сделать это, вызвав encryptstring() с полными текстовыми данными вместо хэша данных.
Вы можете зашифровать пароль, используя сам. Вот как обычно делаются вещи. Просто создайте 'Key' и' IV' на основе пароля (и без случайных факторов), а затем зашифруйте пароль и сохраните его в файл. Вы просто проверяете путем дешифрования. –
Если он не зашифрован, любой может просто открыть его с помощью редактора, который они пожелают, и отследить, пока они этого не захотят. Кроме того, ничто в неконтролируемом ПК не может быть доверено (так что даже шифрование не является 100% -ным решением, если сделано локально) – SJuan76
Как вы собираетесь защитить файл паролем без его шифрования? –