Сравнение хэшей при вводе пароля Excel

вот моя проблема:

  1. Пользователь вводит пароль в разделе «Параметры» программы.
  2. Пароль хешируется (MD5) и сохраняется в реестре.
  3. Программа запускается, создается электронная таблица Excel и защищается паролем с использованием хэшированного значения, хранящегося в реестре.
  4. Пользователь открывает электронную таблицу, и ему предлагается ввести пароль.
  5. Пользователь вводит пароль, но он не работает, несмотря ни на что.

Причина сбоя в том, что пользователь вводит пароль в виде открытого текста, а функция сравнивает его с хешированным значением, что, очевидно, будет ошибкой.

Как я могу хешировать пароль Excel, который вводится при доступе к электронной таблице, чтобы сравнить его с сохраненным хэшем в реестре?

Любые идеи по работе с этим также будут оценены.

Я пишу это на С#, используя Excel Interop...

Спасибо...

Вуди


person Woody    schedule 06.08.2009    source источник


Ответы (3)


Ваша программа должна будет предоставить пароль, потому что пользователь не знает, что это такое!

К счастью, метод Excel.Workbooks.Open принимает аргумент, позволяющий указать требуемый пароль. Таким образом, ваш код может получить хешированный пароль из реестра (или откуда вы его храните), а затем открыть книгу с помощью кода:

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);

Я думаю, это должно делать то, что вы ищете? Дайте нам знать, как это происходит...

Майк

person Mike Rosenblum    schedule 07.08.2009
comment
Нет проблем, Вуди. В C# 3.0 мы вынуждены предоставлять каждый аргумент, поэтому его легко не заметить. Хорошая новость в том, что он есть! :-) - person Mike Rosenblum; 09.08.2009

Как это:

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();
person grenade    schedule 06.08.2009
comment
Спасибо за быстрый комментарий. Но я думаю, что вы можете не понять, что я говорю - я пытаюсь хэшировать значение, которое вводится в Excel при открытии электронной таблицы. Я не знаю способа сделать это, не имея возможности каким-либо образом подключиться к Excel - по сути, во время этой аутентификации... Я знаю, как хэшировать переменные - это проблема хеширования введенного пароля, который вводится в Excel. диалоговое окно... - person Woody; 06.08.2009
comment
Виноват. Я не знаю ответа на этот вопрос. - person grenade; 07.08.2009

Я действительно не знаю, что может сделать взаимодействие с Excel, но в стандартном С#/.NET самый быстрый способ хэшировать пароль в формате MD5:

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

См. метод FormsAuthentication.HashPasswordForStoringInConfigFile. (Да, это глупое имя метода в неправильном пространстве имен!).

person Dan Diplo    schedule 06.08.2009