Проверить личность сборки?Возможно, под его сильным именем? - PullRequest
1 голос
/ 27 июля 2011

В одном из моих приложений я должен отличать мои собственные включенные надстройки от надстроек других.
Они подписаны разными ключами, как и приложение хоста.

Есть ли способ отличить мои сборки от сборки других? (Возможно с помощью ключа подписи)

Ответы [ 4 ]

4 голосов
/ 27 июля 2011

Вы можете проверить токен открытого ключа загруженной сборки по списку, который хранится в сборке контейнера.

http://blogs.msdn.com/b/miah/archive/2008/02/19/visual-studio-tip-get-public-key-token-for-a-stong-named-assembly.aspx

Или просто сохранить полные имена сборок, как это:

var assembly = typeof (string).Assembly;

var myAssemblies = new HashSet<string>
{
 "mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
};

Assert.IsTrue(myAssemblies.Contains(assembly.FullName));

Также вы можете проверить, например, токены, используя GetPublicKeyToken и BitConverter

var assembly = typeof(string).Assembly;

var token = BitConverter.ToString(assembly.GetName().GetPublicKeyToken()).Replace("-","").ToLowerInvariant();

var expectedToken = "b77a5c561934e089";

Assert.AreEqual(expectedToken, token);
2 голосов
/ 22 ноября 2011

Вы можете сделать это, проверив подпись строгого имени. См. Проверка правильности подписи со строгим именем , как это сделать. Обратите внимание, что статья ссылается на использование P / invoke с StrongNameSignatureVerificationEx, но если вы используете .NET 4.0 или выше, вы должны заменить ICLRStrongName :: StrongNameSignatureVerificationEx .

См. Публичные ключи и токены открытого ключа , чтобы узнать, что на самом деле является токеном открытого ключа. Учитывая, что это всего лишь хэш открытого ключа, и, следовательно, его легко дублировать или извлекать, а затем вставлять в ненадежную сборку, он не является безопасным механизмом проверки сборки.

2 голосов
/ 27 июля 2011

Если все ваши сборки подписаны, вы можете использовать GetPublicKey() или GetPublicKeyToken()

 Assembly a =...
 a.GetName().GetPublicKeyToken();

 Assembly a =...
 a.GetName().GetPublicKey();

и будет удобнее, чем вести список GUID, и будет работать с будущими сборками.

1 голос
/ 27 июля 2011

Небольшой хороший фрагмент:

// Assembly is a System.Reflection.Assembly
public string GetAssemblyGUID(Assembly assembly)
{
    object[] objects = assembly.GetCustomAttributes(typeof(System.Runtime.InteropServices.GuidAttribute), false);
    if (objects.Length > 0)
        return ((System.Runtime.InteropServices.GuidAttribute)objects[0]).Value;
    else
        return null;
}

При этом будет получен GUID указанной сборки. Вы можете установить GUID вашей сборки в Свойствах проекта. Это относится и к библиотекам классов и PE.

...