2009-08-06 83 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。 (是的,这是一个愚蠢的方法名称在错误的命名空间!)。