You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使Local State文件夹内的文本文件在记事本中呈加密不可编辑状态?

解决UWP本地文件隐藏失效+实现加密不可编辑的方案

我来帮你搞定这个问题——首先你的隐藏属性设置失效是因为UWP沙箱的权限限制,而且要实现「记事本打开加密不可编辑」的核心需求,光靠隐藏远远不够,得结合内容加密才行,下面一步步来:

一、先修复文件隐藏属性不生效的问题

你当前用File.SetAttributes来设置隐藏属性,但在UWP沙箱环境下,这种桌面API的权限是受限的,不如用UWP原生的StorageFile属性设置方法可靠。直接通过文件属性操作来设置隐藏:

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile file = await storageFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);

// 设置隐藏属性(UWP原生方式)
await file.Properties.SavePropertiesAsync(new Dictionary<string, object>
{
    { "System.FileAttributes", (uint)FileAttributes.Hidden }
});

不过要注意:Windows默认是显示隐藏文件的,用户如果开启了「显示隐藏的文件、文件夹和驱动器」选项,还是能看到它——这也是为什么我们不能只靠隐藏来实现你的需求。

二、核心:实现文件内容加密(让记事本打开是乱码且不可编辑)

要让记事本打开时内容是加密状态且不可编辑,必须对写入文件的内容进行加密,而不是依赖文件属性。这里推荐用AES对称加密,UWP有内置的加密API,以下是完整的实现步骤:

1. 编写加密/解密辅助方法

using System.Security.Cryptography;
using System.Text;

public static class CryptoHelper
{
    // 密钥和IV建议存放在应用安全存储(比如PasswordVault),不要硬编码
    private static readonly byte[] _key = Encoding.UTF8.GetBytes("Your16ByteSecretKey!"); // AES-128需要16字节密钥
    private static readonly byte[] _iv = Encoding.UTF8.GetBytes("Your16ByteIVValue!");

    // 加密文本
    public static string EncryptString(string plainText)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = _key;
            aesAlg.IV = _iv;

            ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msEncrypt = new MemoryStream())
            {
                using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
                {
                    using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                    {
                        swEncrypt.Write(plainText);
                    }
                    return Convert.ToBase64String(msEncrypt.ToArray());
                }
            }
        }
    }

    // 解密文本(应用读取文件时使用)
    public static string DecryptString(string cipherText)
    {
        using (Aes aesAlg = Aes.Create())
        {
            aesAlg.Key = _key;
            aesAlg.IV = _iv;

            ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);

            using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(cipherText)))
            {
                using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
                {
                    using (StreamReader srDecrypt = new StreamReader(csDecrypt))
                    {
                        return srDecrypt.ReadToEnd();
                    }
                }
            }
        }
    }
}

2. 修改文件写入逻辑,加入加密+双重属性保护

StorageFolder storageFolder = ApplicationData.Current.LocalFolder;
StorageFile file = await storageFolder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);

// 对要写入的JSON内容加密
string encryptedJson = CryptoHelper.EncryptString(json);
// 写入加密后的内容
await FileIO.WriteTextAsync(file, encryptedJson);

// 同时设置隐藏+只读属性,双重保障
await file.Properties.SavePropertiesAsync(new Dictionary<string, object>
{
    { "System.FileAttributes", (uint)(FileAttributes.Hidden | FileAttributes.ReadOnly) }
});

这样操作后:

  • 文件会被标记为隐藏+只读,普通用户很难找到并修改
  • 即使找到文件用记事本打开,看到的是加密后的乱码,完全无法识别和编辑
  • 只有你的应用通过解密方法才能读取正确的内容

三、额外注意事项

  • 密钥和IV不要硬编码在代码里,建议用UWP的PasswordVault存储,避免反编译泄露
  • 如果需要追加内容,记得先读取现有加密内容、解密、追加后再重新加密写入,不要直接追加加密文本(会导致解密失败)
  • 只读属性可以防止用户意外修改,但管理员权限还是能修改,所以加密才是最核心的保障

内容的提问来源于stack exchange,提问作者sravya malla

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:14:39