所以我需要能够在我的应用程序中加密/解密相同的设置XML文件。我只能找到使用单独输出文件的示例。我不需要输出文件。没什么超级安全的。我只是基本上需要使设置文件不可读以保护几个连接字符串。我可以使用以下代码加密文件:
public static void EncryptAndSerialize(Object obj)
{
UnicodeEncoding aUE = new UnicodeEncoding();
byte[] key = aUE.GetBytes("password");
RijndaelManaged RMCrypto = new RijndaelManaged();
using (FileStream fs = File.Open(@"D:\Sample.xml", FileMode.Create))
{
using (CryptoStream cs = new CryptoStream(fs, RMCrypto.CreateEncryptor(key, key), CryptoStreamMode.Write))
{
XmlSerializer xmlser = new XmlSerializer(obj.GetType());
xmlser.Serialize(cs, obj);
}
fs.Close();
}
我只需要知道如何使用相同类型的进程来解密同一个文件。如果有人能指出我正确的方向,我将不胜感激。请记住,超安全性不是问题。原谅我的无知这个任务对我来说是新的。
答案 0 :(得分:1)
像这样的东西。请注意,它使用CryptoStreamMode.Read标志调用CreateDecryptor,告诉它从流中读取。
var decryptor = new RijndaelManaged ();
var transformer = decryptor.CreateDecryptor(_decryptKey, _decryptSeed);
var cryptoStream = new CryptoStream(encryptedStream, transformer, CryptoStreamMode.Read);
cryptoStream.CopyTo(resultStream);
resultStream.Close();
一些社论评论:
1)AES会更好,这就是为什么: https://blogs.msdn.microsoft.com/shawnfa/2006/10/09/the-differences-between-rijndael-and-aes/
2)不要低估.net加密 - 微软不会愚弄
3)错误加密可能比没有加密更糟糕,因为它提供了错误的安全感
答案 1 :(得分:1)
他说的加上...... 的MemoryStream ...
https://msdn.microsoft.com/en-us/library/system.io.memorystream(v=vs.110).aspx
import java.util.*
public class Persons {
private Collection<Person> persons;
//If you want the clients to have flexibility to choose the implementation of persons collection.
//Else, hide this constructor and create the persons collection in this class only.
public Persons(Collection<Person> persons) {
this.persons = persons;
}
public void addPerson(Person person) {
persons.add(person);
}
}
如果是我,我会使用两个独立的FileStream。一个用于只读,后一个用于写回.xml文件(您刚刚读取)。我只打算构建和编写后面的,当且仅当我知道我有一个完全形成/填充的接收器。
您也可以调查SecureString的使用(但我离题了):
https://msdn.microsoft.com/en-us/library/system.security.securestring(v=vs.110).aspx
所有这一切,你从不想要直接覆盖文件(即,就地编辑)。如果你这样做,并且写入失败(中途通过),你的原始文件将会损坏。拉链/ nadda /废话让你离开。始终写入新的临时文件,只有在完成100%后才将临时文件提升到源路径(通常通过FileInfo.MoveTo)。
https://msdn.microsoft.com/en-us/library/system.io.fileinfo.moveto(v=vs.110).aspx
如果一路上发生了不好的事情(它会!!!),你所要做的就是删除临时文件(关闭一个catch块等),然后你回到起点。
人类不会知道你实际上工作了两个文件(如果你有一些监视器自动化被串联文件绊倒,那么重写它会导致它很好,垃圾)。