Ответ 1
Когда вы подписываете сборку с сильным именем на основе созданного закрытого ключа, это имеет следующие преимущества:
- Сильное имя гарантирует уникальность идентификатора сборки, добавляя токен открытого ключа и цифровую подпись к сборке.
- Сильное имя может быть сопоставлено с открытым ключом, чтобы доказать, что сборка происходит от издателя с этим открытым ключом и только с этим издателем.
- Сильное имя обеспечивает надежную проверку целостности. Передача проверок безопасности .NET Framework гарантирует, что содержимое сборки не было изменено с момента последней сборки.
Можно ли использовать сильное имя для проверки автора сборки?
Да, как обсуждалось выше, сильное имя может проверить автора сборки последний. Но он не проверяет оригинального автора. Если злоумышленник заменяет ваше сильное имя сборки, все, что можно проверить, это то, что вы не были последним автором сборки. Если он удалит сильное имя, то никакая проверка автора вообще не может быть выполнена.
В какой степени может быть проверена сильная именованная сборка, чтобы избежать подделки?
Следующий код С# проверяет, что злоумышленник не подделал токен открытого ключа, который был записан на вашу сборку, когда вы применяли сильное имя. Он не избегает подделки, но может обнаруживать некоторые виды подделок. В приведенном ниже методе принимается массив байтов, содержащий токен открытого ключа, и сравнивается с фактическим токеном сборки. Обратите внимание, что для того, чтобы этот метод был эффективным, ваш obfuscator выбора должен зашифровать строку, содержащую ваш токен открытого ключа, и только расшифровывать ее на лету, как она используется. И также имейте в виду, что вам нужно иметь разрешение FullTrust для работы этого кода, потому что оно использует отражение под капотом.
// Check that public key token matches what expected.
private static bool IsPublicTokenOkay_Check(byte [] tokenExpected)
{
// Retrieve token from current assembly
byte [] tokenCurrent = Assembly.GetExecutingAssembly().GetName().GetPublicKeyToken();
// Check that lengths match
if (tokenExpected.Length == tokenCurrent.Length)
{
// Check that token contents match
for (int i = 0; i < tokenCurrent.Length; i++)
if (tokenExpected[i] != tokenCurrent[i])
return false;
}
else
{
return false;
}
return true;
}
Пока вы работаете под версией .NET Framework до .NET 3.5 SP1, вы также можете принудительно проверить сильную подпись имени, если сильное имя было удалено злоумышленником или проверка сильного имени была отключен в реестре. Следующий код демонстрирует вызов в статическом методе другого класса под названием NativeMethods. Здесь будет выполняться проверка.
// Check that this assembly has a strong name.
private bool IsStrongNameValid_Check()
{
byte wasVerified = Convert.ToByte(false);
byte forceVerification = Convert.ToByte(true);
string assemblyName = AppDomain.CurrentDomain.BaseDirectory +
AppDomain.CurrentDomain.FriendlyName;
return NativeMethods.CheckSignature(assemblyName,
forceVerification,
ref wasVerified);
}
Фактическая проверка подписи выполняется с использованием P/Invoke, как показано ниже. Использование API StrongNameSignatureVerificationEx довольно сложное - для достойного объяснения см. эту запись в блоге.
// P/Invoke to check various security settings
// Using byte for arguments rather than bool,
// because bool won't work on 64-bit Windows!
[DllImport("mscoree.dll", CharSet=CharSet.Unicode)]
private static extern bool StrongNameSignatureVerificationEx(string wszFilePath,
byte fForceVerification,
ref byte pfWasVerified);
// Private constructor because this type has no non-static members
private NativeMethods()
{
}
public static bool CheckSignature(string assemblyName,
byte forceVerification,
ref byte wasVerified)
{
return StrongNameSignatureVerificationEx(assemblyName,
forceVerification,
ref wasVerified );
}
Обратите внимание, что это не будет работать по умолчанию для приложений с использованием .NET 3.5 SP1 или выше, у которого есть функция отключить эту функцию для вашего приложения, добавив параметр в его файл конфигурации. Но, конечно, любой злоумышленник с доступом для чтения и записи к этому файлу конфигурации может отменить ваше решение.