簡體   English   中英

我如何知道.NET C#中是否更改了文件?

[英]How can I know if a file has been changed in .NET C#?

我有一個應用程序,需要一種安全的方式來存儲其配置。 有些用戶可以更改配置。 我需要某種簽名方案,我可以驗證配置文件沒有更改,沒有有效的用戶。 我曾考慮使用RSA,其中私鑰使用用戶密碼加密,公鑰用於簽署配置。 但是,沒有什么可以阻止某人更改用戶文件並添加自己的公鑰,從而規避我的安全性。 有任何想法嗎?

您可以保持文件加密,只允許在您的應用程序中進行編輯。 這將阻止用戶從您之外的任何工具編輯配置,這可以進行身份​​驗證以驗證用戶是否為“有效用戶”。

在列出的所有方法中,密鑰管理是客戶端計算機上的真正弱點。 密鑰需要解密。 使用另一個密鑰加密該密鑰並不強。 混淆是一個開始。

我使用的是一個包含加密代碼的獨立程序集。 然后通過稱為Steganography的技術存儲密鑰。 我在應用程序的徽標中編碼密鑰。 然后使用已知的軟件值對該密鑰進行加密。 在一種情況下,它可能是特定程序集的校驗和。 因此,對該文件進行任何更改的任何人都將破壞系統。 這絕不是更安全,而是關於隱藏細節。 並將難度從無休到提高。 然后,我通過混淆器和字符串加密器運行程序集。 在嘗試查看程序集時,這會使Reflector崩潰,因此更難以了解正在發生的事情。

這些策略的問題在於,如果您附加調試器,那么您將獲得明確的數據,因為您可以在加密/解密過程之后將值存儲在字符串中。 為了解決這個問題,但沒有消除,我使用System.Security.SecureString類,並且不保持數據清晰。

目標是打破反射器,停止僅使用.NET Framework解密數據的簡單攻擊,通過使用隨機鹽來停止字典攻擊,通過URLE編碼加密緩沖區允許簡單的字符串處理,正確使用初始化向量。

無法完全保護獨立客戶端應用程序。 唯一的方法是對文件執行校驗和並將其驗證到/服務器。 簽名文件的方法不如驗證實際簽名的方式重要。

使用Obfuscation開始保護客戶端應用程序。 此后,您的加密就在下一步。

對於實際簽名,即使SHA系列哈希也應該為您完成工作。 使用SHA512的示例如下:

FileStream fs = new FileStream(@"<Path>", FileMode.Open);

using (SHA512Managed sha512 = new SHA512Managed ())
{
    byte[] hash = sha512.ComputeHash(fs);

    string formatted = string.Empty;

    foreach (byte b in hash)
    {
         formatted += b.ToString("X2");
    }
}

這些矛盾:

  • “我可以通過有效用戶驗證配置文件沒有更改”
  • “沒有什么可以防止有人更改用戶文件”

您應該首先找到保護“用戶文件”的方法。 通過密鑰加密,沒有人可以編輯(除了確定的破解者)或其他。 然后你的RSA計划將起作用。

但請注意, 沒有辦法保護完全在客戶端上運行的應用程序來自確定的破解者。

對於大多數應用程序,不過,你並不需要絕對的安全。 也許您應該先考慮一下您的應用程序實際上“足夠多”的安全性。


但是,如果您需要完美的安全性,則可能需要添加服務器端組件在流程中添加人工干預,例如讓管理員控制用戶文件。

使用管理員密碼加密“用戶文件”。 然后,只要有人想要更改用戶文件,就需要管理員的同意。

我想我要做的是在辦公室保留一把私鑰(A)。 我將使用公共私人對(B)發送應用程序,與我知道的私人(A)簽名。 我將使用我發送的公共私人對(B)來簽署配置文件中的所有內容。 因此,將存在可驗證的一組RSA密鑰(B),其不能改變,因為用於驗證它們的私鑰(A)在辦公室中,並且公鑰(A)是硬編碼的。

暫無
暫無

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

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