使用 Crypto++ 验证 Windows Hello 公钥

问题描述 投票:0回答:2

我正在尝试获取从 Windows Hello 生成的公钥并使用 CryptoPP 库验证签名。 问题之一是根据 Windows Hello 文档,开发人员无权访问私钥,因此我需要使用 Windows Hello (RequestSignAsync()) 提供给我的签名以及公钥。 这可能吗?

我基于此 C# 示例创建了 Windows Hello 界面的 WinRT 版本: https://github.com/Microsoft/Windows-universal-samples/tree/main/Samples/MicrosoftPassport

我有理由不想使用示例中提供的服务器代码,因此我尝试使用 Crypto++ 验证签名。

然后将签名和公钥发送到此 CryptoPP 设置:

   CryptoPP::RSA::PublicKey keyPublic;

   keyPublic.Load(CryptoPP::StringSource(pubkey, true, new CryptoPP::Base64Decoder()).Ref() );

   CryptoPP::RSASS<CryptoPP::PKCS1v15, CryptoPP::SHA256>::Verifier verifier(keyPublic);

   bool bSignatureVerified = false;
   std::string sigdata;

   CryptoPP::StringSource ss(sig,true,
           new CryptoPP::Base64Decoder(
             new CryptoPP::StringSink(sigdata)
           )); // Base64Decoder

   CryptoPP::StringSource ss2(sigdata, true,
                              new CryptoPP::SignatureVerificationFilter(
                                verifier,
                                new CryptoPP::ArraySink((CryptoPP::byte*)&bSignatureVerified,
                                sizeof(bSignatureVerified)
                                )
                              )
   );

   if(!bSignatureVerified)
   {
      return -2; //signed message not valid
   }
   else
   {
      return 0;
   }

公钥和签名是从 Windows Hello 界面发送的。由于某种原因,我在这里验证失败。

这里是 Windows Hello 文档: https://learn.microsoft.com/en-us/windows/uwp/security/microsoft-passport

似乎与我的 Crypto++ 逻辑相匹配(PKCS1v1.5、SHA256、ASN.1 编码),但我一定错过了一些东西。

c++ crypto++ c++-winrt windows-hello
2个回答
0
投票

看起来我不明白我需要传递签名和消息。

这似乎有效:

   CryptoPP::StringSource ss(sig,true,
           new CryptoPP::Base64Decoder(
             new CryptoPP::StringSink(sigdata)
           )); // Base64Decoder

   CryptoPP::StringSource ssmsg(msg,true,
           new CryptoPP::Base64Decoder(
             new CryptoPP::StringSink(msgdata)
           )); // Base64Decoder

   CryptoPP::StringSource ss2(sigdata+msgdata, true,
                              new CryptoPP::SignatureVerificationFilter(
                                verifier,
                                new CryptoPP::ArraySink((CryptoPP::byte*)&bSignatureVerified,
                                sizeof(bSignatureVerified)
                                )
                              )
   );

-1
投票

在被转介给 META 唯一熟练且知识渊博的黑客安吉丽娜(Angelina)寻求帮助之前,我考虑了几种重新访问我的社交媒体帐户的方法。我很惊讶她能够在不到一天的时间内重新进入我的帐户。如果您的帐户遇到问题,请随时与她联系,因为她是该地区最熟练的黑客。您可以通过 Instagram @Angelina_Christopher1738 或发送电子邮件至 [email protected] 与 Angelina 联系。

© www.soinside.com 2019 - 2024. All rights reserved.