【问题标题】:ProtectedData use a dictionary of stringsProtectedData 使用字符串字典
【发布时间】:2016-07-09 03:55:58
【问题描述】:

我会使用我在这里找到的 ProtectedData: https://msdn.microsoft.com/en-us/library/system.security.cryptography.protecteddata%28v=vs.110%29.aspx

我的问题是我无法理解如何使字典适应字节源,尽管它是从 byte [] 字符串转换的,但当我去做 Unprotect 时,无法解密它。我试过了:

没有数据保护的代码:

public static void SetLoginUserDataForFile(ConnectionData data)
{
    Dictionary<string, Dictionary<string, string>> retVal = new Dictionary<string, Dictionary<string, string>>();
    Dictionary<string, string> dataValues = new Dictionary<string, string>();

    if (File.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE")))
    {
        string fileData = File.ReadAllText(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"));
        try
        {
            retVal = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(Decrypt(fileData, "pa$$w0rd"));
        }
        catch (Exception ex)
        {
            retVal = new Dictionary<string, Dictionary<string, string>>();
        }

        dataValues.Add("HashedPwd", data.HashedPwd);
        dataValues.Add("CanAccessOffline", data.LoggedUser.CanAccessOffline.ToString());
        dataValues.Add("CanSavePassword", data.LoggedUser.CanSavePassword.ToString());

        if (retVal.ContainsKey(data.LoggedUser.UserName))
            retVal[data.LoggedUser.UserName] = dataValues;
        else
            retVal.Add(data.LoggedUser.UserName, dataValues);

        File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"), Encrypt(JsonConvert.SerializeObject(retVal), "pa$$w0rd"));
    }
}

我试试这个:

public static void SetLoginUserDataForFile(ConnectionData data)
{
    Assembly assembly = Assembly.GetExecutingAssembly();
    String GuidID = assembly.GetType().GUID.ToString();

    Dictionary<string, Dictionary<string, string>> retVal = new Dictionary<string, Dictionary<string, string>>();
    Dictionary<string, string> dataValues = new Dictionary<string, string>();

    if (File.Exists(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE")))
    {
        string fileData = File.ReadAllText(System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"));
        try
        {
            retVal = JsonConvert.DeserializeObject<Dictionary<string, Dictionary<string, string>>>(Decrypt(fileData, DataProtection.Unprotect(GetBytes(GuidID)).ToString()));
        }
        catch (Exception ex)
        {
            retVal = new Dictionary<string, Dictionary<string, string>>();
        }

        dataValues.Add("HashedPwd", data.HashedPwd);
        dataValues.Add("CanAccessOffline", data.LoggedUser.CanAccessOffline.ToString());
        dataValues.Add("CanSavePassword", data.LoggedUser.CanSavePassword.ToString());

        if (retVal.ContainsKey(data.LoggedUser.UserName))
            retVal[data.LoggedUser.UserName] = dataValues;
        else
            retVal.Add(data.LoggedUser.UserName, dataValues);

        File.WriteAllText(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "PROGRAMFILE", "PROGRAMFILE"), Encrypt(JsonConvert.SerializeObject(retVal), DataProtection.Protect(GetBytes(GuidID)).ToString()));
    }
}

public static byte[] GetBytes(string str)
{
    byte[] bytes = new byte[str.Length * sizeof(char)];
    System.Buffer.BlockCopy(str.ToCharArray(), 0, bytes, 0, bytes.Length);
    return bytes;
}    

一旦我再次阅读它,通过调用文件,不再能够打开它......我该如何解决?

【问题讨论】:

    标签: c# wpf dictionary encryption protected


    【解决方案1】:

    由于某种原因,您假设您的文件是一个文本文件,并且可以通过简单地调用ToString() 来序列化和反序列化字节数组。事实并非如此。

    使用File 的方法读取和写入字节数组。因为那是你所拥有的。

    【讨论】:

    • 我知道你是对的,我必须改变保存结构。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-07
    • 1970-01-01
    相关资源
    最近更新 更多