2015-09-24 4 views
0

Я использую API WinHttp и WinHttpQueryOption, в частности, чтобы убедиться, что мое соединение использует сильное шифрование https. Для этого я делаю следующее:Попытка устранить двусмысленность в отношении SECURITY_FLAG_STRENGTH_ * flags

DWORD dwHttpSecurityFlags = 0; 
DWORD dwcbSzSec = sizeof(dwHttpSecurityFlags); 
if(WinHttpQueryOption(hRequest, WINHTTP_OPTION_SECURITY_FLAGS, &dwHttpSecurityFlags, &dwcbSzSec)) 
{ 
    //Check security -- for connection to employ 128-bit encryption 
    if((dwHttpSecurityFlags & SECURITY_FLAG_SECURE) && 
    (dwHttpSecurityFlags & (SECURITY_FLAG_STRENGTH_WEAK | 
     SECURITY_FLAG_STRENGTH_MEDIUM | 
     SECURITY_FLAG_STRENGTH_STRONG)) == SECURITY_FLAG_STRENGTH_STRONG) 
    { 
     //Passed security check 
    } 
    else 
    { 
     //Security check failed 
    } 
} 
else 
{ 
    //API Failed 
} 

Но я не очень понятно, как SECURITY_FLAG_STRENGTH_* flags используются - как битовые флаги, или как один только для значений?

Если посмотреть в файле заголовка, они определены как таковые:

#define SECURITY_FLAG_SECURE     0x00000001 // can query only 
#define SECURITY_FLAG_STRENGTH_WEAK    0x10000000 
#define SECURITY_FLAG_STRENGTH_MEDIUM   0x40000000 
#define SECURITY_FLAG_STRENGTH_STRONG   0x20000000 

, который намекает на использование побитового, но это не имеет смысла для соединения использовать как 40-разрядные и 128- разрядное сильное шифрование.

Может кто-нибудь прояснить это? Правильно ли мой код?

+0

Что именно вы пытаетесь проверить? Я не понимаю ваш код условия. – torvin

+0

@torvin: 'Проверить безопасность - для подключения к использованию 128-битного шифрования' – c00000fd

ответ

1

Как четко указан в documentation, это поле флага побитового:

WINHTTP_OPTION_SECURITY_FLAGS

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

Если вам необходимо проверить 128-битного шифрования конкретно, то это правильный код:

if (dwHttpSecurityFlags & SECURITY_FLAG_STRENGTH_STRONG) { 
    // Passed security check 
} 

в SECURITY_FLAG_STRENGTH_STRONG означает 128-битное шифрование:

SECURITY_FLAG_STRENGTH_STRONG

Использует сильное (128-битное) шифрование. Это возвращается только при вызове WinHttpQueryOption.

EDIT:

документация не 100% ясно, какой флаг будет установлен в каком положении. Посмотрев на the source code of Wine, становится ясно, что флаги SECURITY_FLAG_STRENGTH_* являются взаимоисключающими. Но другие флаги, такие как SECURITY_FLAG_SECURE, могут быть установлены вместе с одним из SECURITY_FLAG_STRENGTH_* (это именно то, что говорит документация).

+0

Что бы это означало, если установлены флаги' SECURITY_FLAG_STRENGTH_WEAK' и 'SECURITY_FLAG_STRENGTH_STRONG'? – c00000fd

+0

Они не будут установлены оба, но 'SECURITY_FLAG_STRENGTH_STRONG' можно легко комбинировать с другими флагами. Поэтому вы не должны угадывать, какие флаги могут быть объединены, и просто используйте приведенный выше код. Он будет работать в любом случае. – torvin

+0

У вас есть к этому ссылки? Если то, что вы сказали, верно, это противоречит определению «поразрядного поля флага»: https://en.wikipedia.org/wiki/Bit_field, и именно поэтому я задаю этот вопрос. – c00000fd