对外部保存的字节进行编码会引发错误并阻止项目构建

时间:2016-07-08 07:12:27

标签: c# file security encoding byte

好的,这是一件奇怪的事情,我似乎无法找到解决方案。

我已经在C#中使用Tweetinvi工作了几天,我一直致力于身份验证过程。我目前正在做的是使用基于PIN的身份验证为用户检索两个访问令牌。然后我加密这些并在zip文件中存储三个值。

以下是代码:

            byte[] entropy = new byte[20];
            using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
            {
                rng.GetBytes(entropy);
            }

            byte[] accessBytes = ProtectedData.Protect(Encoding.UTF8.GetBytes(Globals.userCredentials.AccessToken), entropy, DataProtectionScope.CurrentUser);
            byte[] accessSecretBytes = ProtectedData.Protect(Encoding.UTF8.GetBytes(Globals.userCredentials.AccessTokenSecret), entropy, DataProtectionScope.CurrentUser);

            // Create temporary directory to store encrypted data

            if (!Directory.Exists(Directory.GetCurrentDirectory() + "\\_temp_zip"))
            {
                Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\_temp_zip");
            }

            // Write files
            File.WriteAllBytes(Directory.GetCurrentDirectory() + "\\_temp_zip\\ent.txt", entropy);
            File.WriteAllBytes(Directory.GetCurrentDirectory() + "\\_temp_zip\\acc1.txt", accessBytes);
            File.WriteAllBytes(Directory.GetCurrentDirectory() + "\\_temp_zip\\acc2.txt", accessSecretBytes);

            // Check if zip already exists. If true, delete
            if(File.Exists(Directory.GetCurrentDirectory() + "\\cred.zip"))
            {
                File.Delete(Directory.GetCurrentDirectory() + "\\cred.zip");
            }

            // Add files to zip
            ZipFile.CreateFromDirectory(Directory.GetCurrentDirectory() + "\\_temp_zip", "cred.zip");

            // Delete temp directory
            Directory.Delete(Directory.GetCurrentDirectory() + "\\_temp_zip", true);

启动时,程序会检查zip文件是否存在。如果是,则打开zip并将文件提取到临时目录。读入每个文件的字节,访问令牌不受保护,并重新编码回字符串。

            if (!Directory.Exists(Directory.GetCurrentDirectory() + "\\_temp_zip"))
            {
                Directory.CreateDirectory(Directory.GetCurrentDirectory() + "\\_temp_zip");
            }

            ZipFile.ExtractToDirectory(Directory.GetCurrentDirectory() + "\\cred.zip", Directory.GetCurrentDirectory() + "\\_temp_zip");

            byte[] entropy = File.ReadAllBytes(Directory.GetCurrentDirectory() + "\\_temp_zip" + "\\ent.txt");
            byte[] accessBytes = File.ReadAllBytes(Directory.GetCurrentDirectory() + "\\_temp_zip" + "\\acc1.txt");
            byte[] accessSecretBytes = File.ReadAllBytes(Directory.GetCurrentDirectory() + "\\_temp_zip"+ "\\acc2.txt");

            // Delete temp directory
            Directory.Delete(Directory.GetCurrentDirectory() + "\\_temp_zip", true);

            // Translate bytes to text
            byte[] cipherAccessToken = ProtectedData.Unprotect(accessBytes, entropy, DataProtectionScope.CurrentUser);
            byte[] cipherAccessTokenSecret = ProtectedData.Unprotect(accessSecretBytes, entropy, DataProtectionScope.CurrentUser);

            string accessToken = Encoding.UTF8.GetString(accessBytes);
            string accessTokenSecret = Encoding.UTF8.GetString(accessSecretBytes);

一切都很好,花花公子,直到程序到达最后两行。出于某种原因,如果留下这些行,Visual Studio将拒绝构建解决方案。起初我认为这是Costura.Fody的一个问题,但我从项目中删除了该问题并且问题仍然存在。

我检查并仔细检查我读入的字节是否与我在第一时间写的字节相同,并且它们看起来确实是正确的。它只是拒绝将字节编码回字符串,我无法弄清楚原因。是否有一种不同的方式我可以编码然后解码字节以便它将构建,或者是否存在所有这些的不同问题?

0 个答案:

没有答案