Я разрабатываю приложение на С# .NET. Приложение не будет подключаться к какой-либо базе данных и во время установки создаст файлы и настройки для приложения и пользователя. Я хочу хранить пользовательские данные в локальном файле, таком как текстовый файл, плоский файл или файл JSON.

Проще говоря, я хочу, чтобы пользователь не открывал файл, но если каким-то образом пользователь найдет способ его открыть, то, по крайней мере, он не должен понимать, какая информация хранится. Есть ли хороший способ зашифровать файл и данные в нем?

Так же, как Google Chrome хранит данные: 1 ŒA û œA àû ¯A ü ÂA °ü ÒA ý åA Pý õA À% B & B p& (B °m <B n OB ðn bB Po uB °o ˆB q ›B Àq ®B r ÁB €r ÔB s çB pt úB °u C @v C  v 3C x FC Àx YC  z lC P| С°| ’C ð} ¥C P~ ¸C 0 ËC ÞC € ñC € D   D ‚ *D °ƒ =D „ ND

1
Abbas Rizvi 2 Фев 2022 в 11:33
Вы можете зашифровать пароль перед сохранением, для большей безопасности вы можете использовать одностороннее шифрование с солью, поэтому, если вы найдете хешированный пароль, вы не сможете получить исходный пароль. удачи
 – 
khaled saleh
2 Фев 2022 в 11:39

2 ответа

Вы можете попробовать зашифровать файл и расшифровать его, когда вам нужно получить к нему доступ.

Шифрование Дешифрирование

Пример шифрования и расшифровки из MS Docs:

using System.IO;
using System.Security.AccessControl;

namespace FileSystemExample
{
    class FileExample
    {
        public static void Main()
        {
            try
            {
                string FileName = "test.xml";

                Console.WriteLine("Encrypt " + FileName);

                // Encrypt the file.
                AddEncryption(FileName);

                Console.WriteLine("Decrypt " + FileName);

                // Decrypt the file.
                RemoveEncryption(FileName);

                Console.WriteLine("Done");
            }
            catch (Exception e)
            {
                Console.WriteLine(e);
            }

            Console.ReadLine();
        }

        // Encrypt a file.
        public static void AddEncryption(string FileName)
        {

            File.Encrypt(FileName);
        }

        // Decrypt a file.
        public static void RemoveEncryption(string FileName)
        {
            File.Decrypt(FileName);
        }
    }
}

0
AnonymousDebug 2 Фев 2022 в 11:58
1
Пожалуйста, добавьте в свой ответ пример кода и/или более подробное объяснение. Ссылки могут умереть.
 – 
Good Night Nerd Pride
2 Фев 2022 в 11:51
В вашей ссылке сказано, что это не следует использовать в основных приложениях .net: docs.microsoft.com/en-us/dotnet/api/…
 – 
Good Night Nerd Pride
2 Фев 2022 в 11:52

Я написал очень простой текстовый шифратор, который вы можете использовать. Просто зашифруйте текст перед его сохранением и расшифруйте по мере необходимости.

Это не остановит того, кто готов провести немного времени с отладчиком, но так же, как и запирание двери, сохранит честность честных людей.

Я также включил несколько модульных тестов, не стесняйтесь их удалять.

using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;

namespace Encryption;
public static class SimpleEncryptor
{
    public static async Task<string> EncryptAsync(string cleartext, string password)
    {
        var hasher = SHA256.Create();
        var key = hasher.ComputeHash(Encoding.UTF8.GetBytes(password));

        using var aes = Aes.Create();
        aes.Key = key;
        aes.Padding = PaddingMode.PKCS7;
        var iv = aes.IV;

        var byteStream = new MemoryStream(10000);
        byteStream.Write(iv, 0, iv.Length);

        using var cryptoStream = new CryptoStream(
            byteStream,
            aes.CreateEncryptor(),
            CryptoStreamMode.Write);
        
        var encryptWriter = new StreamWriter(cryptoStream);
        await encryptWriter.WriteAsync(cleartext);
        encryptWriter.Close();        

        var bytes = byteStream.ToArray();
        var base64 = Convert.ToBase64String(bytes);

        return base64;
    }
    public static async Task<string> DecryptAsync(string ciphertext, string password)
    {
        var hasher = SHA256.Create();
        var key = hasher.ComputeHash(Encoding.UTF8.GetBytes(password));

        var encryptedArray = Convert.FromBase64String(ciphertext);
        var byteStream = new MemoryStream(encryptedArray);

        using var aes = Aes.Create();
        aes.Key = key;
        aes.Padding = PaddingMode.PKCS7;
        var iv = new byte[aes.IV.Length];
        var numBytesToRead = aes.IV.Length;
        var numBytesRead = 0;
        while (numBytesToRead > 0)
        {
            var n = byteStream.Read(iv, numBytesRead, numBytesToRead);
            if (n == 0) break;

            numBytesRead += n;
            numBytesToRead -= n;
        }

        using var cryptoStream = new CryptoStream(
               byteStream,
               aes.CreateDecryptor(key, iv),
               CryptoStreamMode.Read);
        
        var decryptReader = new StreamReader(cryptoStream);
        var decryptedMessage = await decryptReader.ReadToEndAsync();
        
        return decryptedMessage;
    }
}


public class EncryptorTests
{
    [Test]
    [TestCase("How do you turn this on?", "Swordfish", "GHzrU6z5hsgb6HSJtMZyirEs11sHY/X4l5zElwxHz9jpIGA+D9TAxv7SEU31/Jgb")]
    [TestCase("Orange you glad I didn't say banana?", "hunter12", "qqNFxhwKYkkYzsN0vDzWhQguZ7f9xc+60duZXQATAzQslRhJsn6lc691+yVR0SWJYDJUD9ZbezpW/v4vYi6qeA==")]
    [TestCase("Orange you glad I didn't say banana?", "hunter12", "TsjCbMOT4UKVi6L43Kkc0rMsl6IyeEfLBR3ruAsG+APUjb1zesVLGA/B0yF4FkFV/j1Rc5B55ClZYHV2zoubBA==")]
    [TestCase("Your mother is rather fat.", "12345", "WD8e5E+PtQ5kMqkPSIZa18pDutbqn8OroSU5utHFTuikbgIWLA4IRAHihrfiXrV6")]
    [TestCase("Yer' a wizard harry!", "Swordfish", "Z6tF/3iDTu72qTeVnKa8DZOsL5NFD9XfqJTWebANVrjQysm+8ps3Z9RuoJyenk30")]
    public async Task TestDecryption(string text, string password, string ciphertext)
    {
        var decoded = await SimpleEncryptor.DecryptAsync(ciphertext, password);

        Assert.AreEqual(text, decoded);
    }

    [Test]
    [TestCase("How do you turn this on?", "Swordfish")]
    [TestCase("Orange you glad I didn't say banana?", "hunter12")]
    [TestCase("Your mother is rather fat.", "12345")]
    [TestCase("Yer' a wizard harry!", "Swordfish")]
    public async Task TestEncryptAndDecrypt(string text, string password)
    {
        var ciphertext = await SimpleEncryptor.EncryptAsync(text, password);

        var decodedtext = await SimpleEncryptor.DecryptAsync(ciphertext, password);

        Assert.AreEqual(text, decodedtext);
    }
}
0
Julian Silden Langlo 3 Фев 2022 в 13:20