【问题标题】:Trying to resolve ambiguity concerning SECURITY_FLAG_STRENGTH_* flags试图解决有关 SECURITY_FLAG_STRENGTH_* 标志的歧义
【发布时间】:2015-09-24 00:12:46
【问题描述】:

我使用WinHttpWinHttpQueryOption API 特别是为了确保我的连接采用强https 加密。为此,我正在执行以下操作:

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 位强加密没有意义。

有人可以澄清一下吗?我上面的代码正确吗?

【问题讨论】:

  • 您到底想检查什么?我不明白你的条件代码。
  • @torvin: Check security -- for connection to employ 128-bit encryption

标签: c++ c winapi https winhttp


【解决方案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 时返回。

编辑:

文档不是 100% 清楚在哪种情况下将设置哪个标志。查看the source code of Wine 后,很明显SECURITY_FLAG_STRENGTH_* 标志是互斥的。但其他标志,如SECURITY_FLAG_SECURE 可以与SECURITY_FLAG_STRENGTH_* 之一一起设置(这正是文档所说的)。

【讨论】:

  • 如果SECURITY_FLAG_STRENGTH_WEAKSECURITY_FLAG_STRENGTH_STRONG 标志都被设置,那么“清楚地”意味着什么?
  • 它们不会同时设置,但SECURITY_FLAG_STRENGTH_STRONG 可以很容易地与其他标志组合。所以你不应该猜测可以组合哪些标志,只需使用上面提供的代码。它在任何情况下都可以工作。
  • 您对此有什么参考吗?如果你说的是真的,这与bitwise flag field 的定义相矛盾:en.wikipedia.org/wiki/Bit_field 这就是我问这个问题的原因。
  • 您发现与位域定义有什么矛盾?
  • 不在位域定义中,your explanation是矛盾的:"They won't be set both"
猜你喜欢
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多