Когда вы подписываете сборку со строгим именем на основе созданного вами закрытого ключа, это дает следующие преимущества:
- Строгое имя гарантирует уникальность идентификатора сборки путем добавления токена открытого ключа и цифровой подписи в сборку.
- Строгое имя можно сопоставить с открытым ключом, чтобы доказать, что сборка исходит от издателя с этим открытым ключом и только от этого издателя.
- Строгое имя обеспечивает строгую проверку целостности. Прохождение проверок безопасности .NET Framework гарантирует, что содержимое сборки не изменилось с момента его последней сборки.
Можно ли использовать строгие имена для проверки автора сборки?
Да, как обсуждалось выше, строгие имена могут проверить автора последнего сборки. Но это не подтверждает первоначального автора. Если злоумышленник заменит строгое имя вашей сборки, то все, что можно проверить, это то, что вы не были последним автором сборки. Если он удаляет строгое имя, то никакая проверка автора не может быть сделана вообще.
В какой степени можно проверить сборку со строгим именем, чтобы избежать вмешательства?
Следующий код C # проверяет, что злоумышленник не подделал маркер открытого ключа, который был записан в вашу сборку, когда вы применили строгое имя. Он не избегает взлома, но может обнаружить некоторые виды взлома. Приведенный ниже метод принимает массив байтов, содержащий ваш токен открытого ключа, и сравнивает его с фактическим токеном сборки. Обратите внимание, что для того, чтобы этот метод был эффективным, ваш обфускатор должен зашифровать строку, содержащую ваш токен открытого ключа, и дешифровать его только на лету, когда он используется. Также имейте в виду, что для работы этого кода необходимо разрешение FullTrust, так как он использует отражение под капотом.
// Check that public key token matches what's 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, как показано ниже. Использование StrongNameSignatureVerificationEx API довольно запутанно - для приличного объяснения см. эту запись в блоге .
// 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 с пакетом обновления 1 (SP1) или более поздней версии, которые имеют функцию обхода строгого имени . можно отключить эту функцию для вашего приложения, добавив параметр в его конфигурационный файл. Но, конечно, любой злоумышленник, имеющий доступ на чтение / запись к этому файлу конфигурации, может отменить ваше решение.