Проверяет ли сравнение открытых ключей двух сборок, что они подписаны одним и тем же закрытым ключом? - PullRequest
1 голос
/ 27 января 2012

Из других вопросов и статей, которые я прочитал, звучит так, как будто подделанная сборка была подделана, ее хеш будет другим и не будет запущен. Если это так, то могу ли я сделать вывод, что если открытый ключ неизвестной сборки соответствует открытому ключу известной сборки, а .net позволяет запускать неизвестную сборку, то неизвестная сборка была подписана тем же файлом ключа и не была подделана с

Кстати, я прочитал эту статью , но она спрашивает о подписанном MSI, и похоже, что это может быть другой случай, чем подписанная сборка .net.

Редактировать: вот мой пример кода

static void Main(string[] args)
    {
        string unknownAppPath = args[0];
        byte[] unknownKeyBytes = Assembly.LoadFile(unknownAppPath).GetName().GetPublicKey();
        string unknownKeyStr = BitConverter.ToString(unknownKeyBytes);
        Assembly asm = Assembly.GetExecutingAssembly();
        AssemblyName aname = asm.GetName();
        byte[] pubKey = aname.GetPublicKey();
        string hexKeyStr = BitConverter.ToString(pubKey);
        if (hexKeyStr == unknownKeyStr)
        {
            Console.WriteLine("Signed by same private key");
        }
        else
        {
            Console.WriteLine("Uknown signer!");
        }
        Console.ReadKey(); 
    }

Далее я прочитал эту статью , в которой используется гораздо более сложный метод. В статье я вижу, что он говорит о недостатках использования открытого ключа tokens , но не понимаю, почему не использовать весь открытый ключ. Судя по полученным ответам, звучит так: для этого нужен открытый ключ ... проблема в этой статье в том, что вам нужно попробовать запустить сборку? (он говорит: «... но вы не сможете обнаружить это, не проверив, прошла ли проверка сборка».)

Ответы [ 3 ]

3 голосов
/ 27 января 2012

Да; так работают открытые ключи.

Вам также необходимо убедиться, что сборка отсутствует в списке пропуска проверки; запустите sn-Vl в командной строке VS.

1 голос
/ 27 января 2012

Упрощенно, открытый ключ может использоваться для расшифровки данных, зашифрованных с помощью закрытого ключа. Если данные могут быть зашифрованы с помощью другого закрытого ключа, то вся система будет взломана. Это одно из фундаментальных утверждений криптографии с открытым ключом.

0 голосов
/ 27 января 2012

Я не уверен, отвечает ли это на ваш вопрос, но здесь я иду: вы можете явно указать PublicKeyToken в ваших ссылках, и Fusion (загрузчик сборок .net) не загрузит сборку, если * 1002 сборки* не совпадает.

Я думаю, что другие ответы относятся к шифрованию с открытым ключом, где я понимаю, что вы спрашиваете, как Fusion обрабатывает PublicKeyToken, а не открытые ключи (сборкине зашифрованы).

...