好的,这是一件奇怪的事情,我似乎无法找到解决方案。
我已经在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的一个问题,但我从项目中删除了该问题并且问题仍然存在。
我检查并仔细检查我读入的字节是否与我在第一时间写的字节相同,并且它们看起来确实是正确的。它只是拒绝将字节编码回字符串,我无法弄清楚原因。是否有一种不同的方式我可以编码然后解码字节以便它将构建,或者是否存在所有这些的不同问题?