首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET Framework 2.0 RSA 加密實戰:常見異常排查與解決方案

     編輯:關於.NET

RSACryptoServiceProvider 引發的異常曾讓我抓狂,特此總結核心問題與解決之道,供遇到類似困境的開發者參考。

典型代碼場景

WindowsIdentity wi = Logon(UserName, Password);
if (null != wi) {
    WindowsImpersonationContext wic = wi.Impersonate();
    CspParameters cp = new CspParameters();
    cp.ProviderType = 1;
    cp.Flags = CspProviderFlags.UseMachineKeyStore;
    cp.KeyNumber = (int)KeyNumber.Exchange;
    cp.KeyContainerName = "KEY_1";
    RSACryptoServiceProvider csp = new RSACryptoServiceProvider(cp);
    this.txtPublicKey.Text = this.PublicKey = csp.ToXmlString(false);
    csp.Clear();
    wic.Undo();
}

問題一:CryptographicException(ASP.NET 環境)

現象:部署至 IIS 後間歇性拋出異常。
位置:XP 下 aspnet_wp.exe,Server 2003 下 w3wp.exe。

根因與解決

在模擬身份期間創建金鑰對,加解密後必須在撤銷模擬前呼叫 Clear() 釋放金鑰。正確順序:

  1. ImpersonateUser
  2. Create new RSACryptoServiceProvider (pair)
  3. Encrypt/Decrypt
  4. Call Clear() to release keys (pair.Clear())
  5. Undo impersonation

問題二:權限不足導致金鑰檔案無法刪除

現象:RSACryptoProvider 創建金鑰檔案但因權限不足無法刪除。

解決

確認代理服務帳戶對 RSA 機器金鑰資料夾(如 C:\Documents and Settings\All Users\Application Data\Microsoft\Crypto\RSA)擁有「完全控制」權限。

問題三:CryptographicException:「該項不適於在指定狀態下使用」

現象:僅在客戶機器出現,本地所有機器無法重現。客戶環境無法遠程調試。

排查過程

  • 詢問環境變化:客戶重裝過產品。
  • 懷疑產品問題:加密時模擬的用戶是公司產品建立的帳戶。
  • 最終定位:本地非網域用戶密碼被管理員重置。在 XP/2003 上,這會導致 DPAPI 保護的所有資料(含用戶私鑰)丟失,直到密碼恢復。這是設計使然,也是重要安全特性。

解決方案

  1. 方案一:將模擬帳戶密碼恢復為原密碼。
  2. 方案二:刪除 C:\Documents and Settings\%userName%\Application Data\Microsoft\Crypto 目錄。

問題暫時告一段落。若對你有幫助,記得頂一下。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved