2013-09-27 2 views
1
아무도 그것을 읽을 수 있도록 내가 파일에 내 DataTable을 저장할

:저장 XML 데이터

private DataTable machineTable = new DataTable(); 
    private Rijndael crypto = Rijndael.Create(); 
    private FileStream stream; 
    ... 
    this.crypto.IV = ASCIIEncoding.ASCII.GetBytes(IV); 
    this.crypto.Key = ASCIIEncoding.ASCII.GetBytes(password); 

    this.stream = new FileStream(Global.MachineParametersDataFile, FileMode.OpenOrCreate, FileAccess.Write); 
    CryptoStream cryptoStream = new CryptoStream(this.stream, crypto.CreateEncryptor(this.crypto.Key, this.crypto.IV), CryptoStreamMode.Write); 
    this.machineTable.WriteXml(stream, XmlWriteMode.WriteSchema, true); 

비밀번호 : 32 바이트 IV : 16 바이트

내 코드를 두 쌍의 이진 라인을 만들었지 만 나머지는 완전히 암호화되지 않았습니다.

+0

IV를 어떻게 보관하고 있습니까? 전통적으로 암호화 블롭의 첫 번째 16 바이트로 추가됩니다. IV는 비밀로 유지할 필요가 없으며 단지 암호화 당 무작위이어야합니다. 또한 IV로 문자열을 전달하는 것처럼 보입니다. 실제로 [GenerateIV()] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.symmetricalgorithm.generateiv)를 사용해야합니다. aspx) 때마다 임의의 IV를 얻으려면 –

+0

마지막으로 암호화 된 BLOB에 대한 무차별 공격으로부터 자신을 보호하려면 [PBKDF2] (http://msdn.microsoft.com/en-us/)를 사용해야합니다. library/system.security.cryptography.rfc2898derivebytes.aspx) 키 생성 속도를 늦추십시오. 키를 생성하는 데 500ms가 걸리는 충분한 크기의 ['IterationCount'] (http://msdn.microsoft.com/en-us/library/system.security.cryptography.rfc2898derivebytes.iterationcount.aspx)를 넣을 수 있습니다. 최종 사용자는 프로그램을 사용하기 위해 500ms를 기다려야 만합니다. 공격자는 암호를 추측 할 때마다 500ms를 기다려야합니다 (함수 용 소금으로 IV를 다시 사용하십시오) –

답변

3

cryptoStream이 아닌 스트림에 쓰고 있습니다. this.machineTable.WriteXml(cryptoStream, XmlWriteMode.WriteSchema, true);

관련 문제