gpt4 book ai didi

javascript - 如何在 C# 中验证 Javascript 的验证码

转载 作者:太空宇宙 更新时间:2023-11-03 23:05:59 30 4
gpt4 key购买 nike

我能够使用 PowerShell Set-AuthenticodeSignature 对 js 文件进行签名。之后我可以看到签名以以下形式出现在文件中:

// SIG // Begin signature block
// SIG // MIIKgAYJKoZIhvcNAQcCoIIKcTCCCm0CAQExCzAJBgUr
// SIG // ....
// SIG // End signature block

我可以使用 Get-AuthenticodeSignature 验证签名。它说 sig 是有效的,但我找不到在 C# 代码中验证签名的方法。所有这些选项都失败了:

  1. X509Certificate.CreateFromSignedFile
  2. X509Certificate object c# performance and memory issues alternative – fixed
  3. 使用 Wintrust.dll 中的 WinVerifyTrust
  4. 从 PowerShell 移植了 Get-AuthenticodeSignature 的一部分!

也许有一些特定的api来验证js签名?

最佳答案

我最近遇到了类似的问题,让我展示一下我是如何解决这个问题的。在我走之前,我现在做的假设很少。如果我错了,请纠正我。

  1. wintrust 适用于除脚本文件以外的所有其他情况,例如.js 或 .vbs
  2. 您可能已经尝试从一个 控制台应用程序 (C#)

我发现这只发生在我上面提到的脚本文件中,因为当从自由线程单元模型 (MTA) 执行其方法时,wintrust 的行为很奇怪。一旦它被包裹在 STA 线程中,它就开始为我工作。后来我知道这是一个历史问题,我们在处理来自.Net应用程序的任何COM组件互操作时应该采取预防措施。

这是代码片段,您可以将 verifysignature 替换为您的 wintrust 代码逻辑并尝试。我希望这会有所帮助。

            public static void CheckSignature()
{
STAApartment apt = new STAApartment();
var result = apt.Invoke(() =>
{
return VerifySignature(@".\signedjsfile.js", false);
});
Console.WriteLine(result);
}

private static WinVerifyTrustResult VerifySignature(string filePath, bool verifySignatureOnly)
{

using (var wtd = new WinTrustData(new WinTrustFileInfo(filePath))
{
dwUIChoice = WintrustUIChoice.WTD_UI_NONE,
dwUIContext = WinTrustDataUIContext.WTD_DATA_UI_EXECUTE,
fdwRevocationChecks = WinTrustDataRevocationChecks.WTD_REVOCATION_CHECK_WHOLECHAIN,
dwStateAction = WintrustAction.WTD_STATEACTION_IGNORE,
dwProvFlags = verifySignatureOnly ? WintrustProviderFlags.WTD_HASH_ONLY_FLAG : WintrustProviderFlags.WTD_REVOCATION_CHECK_CHAIN
})
{
var result = WinTrust.WinVerifyTrust(
WinTrust.INVALID_HANDLE_VALUE, new Guid(WinTrust.WINTRUST_ACTION_GENERIC_VERIFY_V2), wtd
);
return result;
}
}

public class STAApartment
{
public T Invoke<T>(Func<T> func)
{
var tcs = new TaskCompletionSource<T>();
Thread thread = new Thread(() =>
{
try
{
tcs.SetResult(func());
}
catch (Exception e)
{
tcs.SetException(e);
}
});
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
return tcs.Task.Result;
}
}

关于javascript - 如何在 C# 中验证 Javascript 的验证码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41138445/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com