簡體   English   中英

c#,檢查文件是否正確

[英]c# , checking is file correct

我有一個c#程序,還有一個文件,它從中讀取一些信息。 我需要用戶無法更改該文件的內容,我需要一些方法來確定該文件是否正確(不會被用戶更改)。 如果您有任何想法,請一起討論。 非常感謝

計算文件校驗和crchash並將其寫出文件本身(在將其寫出哈希之前計算哈希值)。 然后在加載文件時,檢查是否存在此哈希,將其刪除並重新計算哈希值。 驗證它們是否匹配。 如果他們不這樣做,那么它就被篡改了。 無論何時自己更改內容,都要更新校驗和/哈希。

沒有完全可靠的方法來完成你想要的東西。 如果您對文件進行哈希處理,則用戶可以修改該文件並重新生成哈希值,然后您的程序會認為該文件未經修改。 如果您嘗試在注冊表中隱藏哈希,用戶可以輕松使用SysInternals工具來檢測您將其保存到的位置。

您可以使用數字簽名文件,這類似於哈希它,除了它涉及一個密鑰。 但是,您仍然遇到密鑰必須保密的問題,並將其存儲在應用程序或計算機上的某個位置,這樣用戶就有可能找到密鑰,然后他們又可以修改文件並將其重新簽名。您的程序無法檢測到修改。

您可以讓您的應用程序向您創建的Web服務提交文件,或者可能只提供文件的哈希以提高效率。 Web服務可以對文件或散列進行數字簽名,並返回簽名或將其存儲在服務器上。 稍后當應用程序讀取文件時,它可以使用簽名和服務器的公鑰(您必須從服務器獲取此信息以確保文件已由服務器簽名)以驗證文件是否未更改。 或者,如果服務器存儲了簽名,您可以將文件或哈希重新提交給服務器,它可以驗證文件並將結果返回給應用程序。 同樣,這不是完全的。 用戶可以通過多種方式欺騙Web服務,即使使用SSL也有辦法繞過它。 用戶可以完全破解您的應用程序並刪除驗證碼。

從您的其他問題來看,這是軟件激活系統的一些組成部分。 只需看看Adobe和Microsoft,以及他們創建這樣一個系統的失敗嘗試。 如果你認為你可以做得更好,祝你好運。 有更好的方法可以確保您的軟件在沒有激活系統的情況下合法使用,而這些激活系統只會讓您的忠實用戶感到沮喪。

查看MD5哈希算法。

您不能在其文件系統中限制用戶,但您的應用程序可以存儲文件參數(創建和修改的時間戳,大小)並在其內容上創建哈希,以便在下次文件使用之前與這些值進行比較。

UPD。

如果你想避免用戶修改文件無論如何你必須限制他訪問它而不是閱讀。 所以你有兩個選擇:

  1. 使用安全授權並從ACL中刪除用戶。 如果用戶是管理員,那是個壞主意。 在其他情況下,如果可能,您最好定義一些用戶組。
  2. 使用數據庫。 這可以是一些輕型本地DB,只有高級用戶才能修改,例如SQLite。 但這只能假設用戶無法打開此文件(無法安裝相應的工具......)

如果您只需要在C#中以只讀方式打開文件,則可以通過指定FileAccess.Read標志來執行此操作:

using (FileStream fs1 = new FileStream(path, FileMode.Open, FileAccess.Read))
{
    using (StreamReader rd1 = new StreamReader(fs1))
    {
        while ((str = rd1.ReadLine()) != null)
        {
            //do stuff
        }
    }
}

您可以使用哈希來確保文件沒有更改?

public static void Main(string[] args)
{
    using (HashAlgorithm hashAlg = new SHA1Managed())
    {
        using (Stream file = new FileStream("C:\\test.txt", FileMode.Open, FileAccess.Read))
        {
            byte[] hash = hashAlg.ComputeHash(file);
            Console.WriteLine(BitConverter.ToString(hash));
        }
    }
}

要么

BitConverter.ToString(MD5.Create().ComputeHash(File.ReadAllBytes("C:\\test.txt")))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM