2009-08-06 110 views
1

的時候,這裏是我的問題:比較哈希輸入Excel密碼

  1. 用戶在程序的選項部分輸入密碼。
  2. 密碼被散列(MD5)並存儲在註冊表中。
  3. 運行該程序,創建Excel電子表格,並使用存儲在註冊表中的哈希值保護密碼。
  4. 用戶打開電子表格,並提示輸入密碼。
  5. 用戶輸入密碼,但無論如何都會失敗。

它失敗的原因是因爲用戶以明文形式輸入密碼,但該函數將其與散列值進行比較,這顯然是錯誤的。

如何散列在訪問電子表格時輸入的Excel密碼以便將其與註冊表中存儲的散列進行比較?

任何想法解決這個問題也將不勝感激。

我在使用Excel互操作C#寫這個...

謝謝...

伍迪

回答

1

您的程序將不得不提供密碼,因爲用戶不知道它是什麼!

幸運的是,Excel.Workbooks.Open方法帶有一個參數,允許您指定所需的密碼。所以,你的代碼可以從註冊表哈希密碼(或隨時隨地可以存儲它),然後通過代碼打開wokrbook:

string fileName = @"C:\..."; 
string password = GetHashedPasswordFromRegistry(); 

Excel.Workbook workbook = excelApp.Workbooks.Open( 
    fileName, Type.Missing, Type.Missing,Type.Missing, 
    password, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing, Type.Missing, 
    Type.Missing, Type.Missing, Type.Missing); 

我想這應該做你想要的?讓我們知道它是怎麼回事...

Mike

+0

我不敢相信我忽略了那個選項。謝謝,邁克...... – Woody 2009-08-08 15:30:20

+0

沒問題,伍迪。在C#3.0中,我們不得不提供每一個參數,所以很容易忽視。好消息是它在那裏! :-) – 2009-08-08 20:18:51

0

像這樣:

using System; 
using System.Security.Cryptography; 
using System.Text; 

public static class Helpers 
{ 
    public static Guid GetHash(string password) 
    { 
     return new Guid(new MD5CryptoServiceProvider().ComputeHash(Encoding.ASCII.GetBytes(password.Trim()))); 
    } 
} 

用法:

string hash = Helpers.GetHash("password").ToString(); 
+0

感謝您的快速評論。但我認爲你可能不明白我在說什麼 - 我試圖在電子表格打開時對輸入到Excel的值進行散列。我知道沒有辦法做到這一點,而不能以某種方式掛鉤到Excel中 - 實質上,在認證期間......我知道如何散列變量 - 這是將輸入到Excel中的輸入密碼散列化的問題對話框... – Woody 2009-08-06 19:52:33

+0

我的不好。我不知道這個答案。 – grenade 2009-08-06 20:25:04

0

我不會真的知道Excel的互操作可以做,但在標準C#/。NET哈希在MD5格式的密碼,最快的方法就是使用:

string hashedPassword = System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile("password", "MD5") 

FormsAuthentication.HashPasswordForStoringInConfigFile Method。 (是的,這是一個愚蠢的方法名稱在錯誤的命名空間!)。