2010-10-14 117 views

回答

4

對於簡單的加密需求,我通過ProtectedData類使用了DPAPI。爲了使得到的加密值可以存儲在文本文件或註冊表中,我編碼生成的字節數組。

這裏是我寫來包裝這件事類:

namespace SomeNamespace 
{ 
    using System; 
    using System.Security.Cryptography; 
    using System.Text; 

    /// <summary> 
    /// used for encryption and decryption 
    /// </summary> 
    public static class DataProtector 
    { 
     private const string EntropyValue = "secret"; 

     /// <summary> 
     /// Encrypts a string using the DPAPI. 
     /// </summary> 
     /// <param name="stringToEncrypt">The string to encrypt.</param> 
     /// <returns>The encrypted data.</returns> 
     public static string EncryptData(string stringToEncrypt) 
     { 
     byte[] encryptedData = ProtectedData.Protect(Encoding.Unicode.GetBytes(stringToEncrypt), Encoding.Unicode.GetBytes(EntropyValue), DataProtectionScope.LocalMachine); 
     return Convert.ToBase64String(encryptedData); 
     } 

     /// <summary> 
     /// Decrypts a string using the DPAPI. 
     /// </summary> 
     /// <param name="stringToDecrypt">The string to decrypt.</param> 
     /// <returns>The decrypted data.</returns> 
    public static string DecryptData(string stringToDecrypt) 
     { 
     byte[] decryptedData = ProtectedData.Unprotect(Convert.FromBase64String(stringToDecrypt), Encoding.Unicode.GetBytes(EntropyValue), DataProtectionScope.LocalMachine); 
     return Encoding.Unicode.GetString(decryptedData); 
     } 
    } 
} 
+0

是的,感謝您的代碼,我設法做到了我自己...我愛你! – 2010-10-15 04:49:43

2

如果你加密密碼,你仍然需要在程序的某個地方存儲一個解密密鑰,所以它仍然是安全的。

但是,它保持誠實的人誠實。

我見過的最常見的做法是挑戰/迴應系統,用戶輸入一個註冊名稱,程序提供一個質詢字符串,然後通過電子郵件發送相應的響應字符串(加密),其中用戶剪切並粘貼到程序中的註冊對話框中。該程序解密響應,將其與挑戰進行比較,然後離開。

當然,由於你仍然必須在程序本身提供解密密碼,它仍然可以被一個確定的黑客擊敗。

4

一個簡單的方法就是用自己加密密碼。你將永遠無法解密它,但你將能夠比較用戶輸入的密碼。

+0

+1我喜歡這個主意。 – 2010-10-14 20:16:45

+0

你能給我一個提示,我怎樣才能「用自己的密碼加密」......你是什麼意思?謝謝。 – 2010-10-14 20:57:43

+1

我懷疑OP想存儲密碼,以便用戶不需要再次輸入密碼......如果是這種情況,這種解決方案不是很有幫助;) – 2010-10-14 23:04:24

相關問題