如何使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
相关产品推荐
相关产品推荐

