Можно ли проверить, была ли подписана динамически загруженная сборка с определенным сильным именем?
Достаточно ли/безопасно сравнивать значения, возвращаемые из метода AssemblyName.GetPublicKey()?
Assembly loaded = Assembly.LoadFile(path);
byte[] evidenceKey = loaded.GetName().GetPublicKey();
if (evidenceKey != null)
{
byte[] internalKey = Assembly.GetExecutingAssembly().GetName().GetPublicKey();
if (evidenceKey.SequenceEqual(internalKey))
{
return extension;
}
}
Нельзя ли это подделать? Я не уверен, что метод SetPublicKey() оказывает какое-либо влияние на встроенную сборку, но даже документация MSDN показывает, как вы можете использовать это на динамически сгенерированной сборке (отражение emit), так что это означает, что вы можете извлечь открытый ключ из хост-приложение и вставлять его в собственную сборку и запускать надежный код, если выше это было безопасным, или я чего-то не хватает?
Есть ли более правильный и безопасный подход? Я знаю, была ли ситуация с обратным адресом сценарием, то есть там, где я хотел защитить сборку только от вызываемых подписанными хостами, я мог бы пометить сборку атрибутом StrongNameIdentityPermission.