java openssl_verify_CryptoAPI:如何使用CryptVerifySignature验证来自OpenSSL或Java的DSA签名...
如果不了解CryptoAPI,这应该是非常困难的。
主要障碍是:
使用CryptStringToBinaryA和CryptDecodeObjectEx解码X509 DSA公钥
转换DSA签名格式
OpenSSL的DSA_sign以ASN.1 DER格式生成DSA签名
CryptoAPI的CryptVerifySignature需要P1363格式的DSA签名
以下是我最终解决问题的粗略示例:
const char* pubKey = "MIIBtjCCASsGByqGSM44BAEwggEeAoGBANW/k8nYREKtRMvIShnJTSAwxF33haU4"
.....
"/FEGAibbOp31rjq9UfaJ2t06eN0t0B+DP1hjz/MfpGtPOxHqF3dQnDRa3ot1FSTP";
bool verify(const unsigned char* msgData, unsigned int msgLength, const unsigned char* signature, unsigned int signatureLength)
{
HCRYPTPROV hCryptProv;
if (!CryptAcquireContext(&hCryptProv, NULL, NULL, PROV_DSS, CRYPT_VERIFYCONTEXT))
{
return false;
}
bool result = false;
unsigned char derPubKey[2048];
DWORD derPubKeyLen = 2048;
CERT_PUBLIC_KEY_INFO *publicKeyInfo = NULL;
DWORD publicKeyInfoLen = 0;
if ( CryptStringToBinaryA( pubKey, strlen(pubKey), CRYPT_STRING_BASE64, derPubKey, &derPubKeyLen, NULL, NULL ) &&
CryptDecodeObjectEx( X509_ASN_ENCODING, X509_PUBLIC_KEY_INFO, derPubKey, derPubKeyLen,
CRYPT_ENCODE_ALLOC_FLAG, NULL, &publicKeyInfo, &publicKeyInfoLen ) )
{
HCRYPTKEY hPubKey;
if (CryptImportPublicKeyInfo(hCryptProv, X509_ASN_ENCODING, publicKeyInfo, &hPubKey))
{
HCRYPTHASH hHash;
if (CryptCreateHash(hCryptProv, CALG_SHA1, 0, 0, &hHash))
{
CryptHashData(hHash, msgData, msgLength, 0);
BYTE* dsaSignature = NULL;
DWORD dsaSignatureLen = 0;
if (CryptDecodeObjectEx( X509_ASN_ENCODING, X509_DSS_SIGNATURE, signature, signatureLength,
CRYPT_ENCODE_ALLOC_FLAG, NULL, &dsaSignature, &dsaSignatureLen ) )
{
if (CryptVerifySignature(hHash, dsaSignature, dsaSignatureLen, hPubKey, NULL, 0))
{
result = true;
}
LocalFree(dsaSignature);
}
CryptDestroyHash(hHash);
}
CryptDestroyKey(hPubKey);
}
LocalFree(publicKeyInfo);
}
CryptReleaseContext(hCryptProv, 0);
return result;
}
java openssl_verify_CryptoAPI:如何使用CryptVerifySignature验证来自OpenSSL或Java的DSA签名...相关推荐
- Java中的证书透明度验证
因此,我有一个幼稚的想法,即除了证书有效性检查(在Java中)之外,将证书透明性验证作为每个请求的一部分也很容易. 牺牲了整个周末的一半时间,我可以证明这并不是一件小事. 但是, 证书透明性是什么? ...
- Java应用程序中的验证
我经常看到的项目几乎没有任何有意识的数据验证策略. 他们的团队在截止日期,明确要求的巨大压力下工作,只是没有足够的时间以适当且一致的方式进行验证. 因此,数据验证代码随处可见:JavaScript片段 ...
- Java微信开发之接入验证
最近在做微信开发,最开始尝试了很多次都不成功.昨天尝试成功了,还没有开始进一步开发,想把昨天尝试成功的过程记录一下.我是查了很久的资料也尝试过很多方法,现在我把我遇到的问题和解决方法记录一下.我是部署 ...
- 梦魇java_[Java教程]魔鬼的梦魇—验证IE中的JS内存泄露模式(一)
[Java教程]魔鬼的梦魇-验证IE中的JS内存泄露模式(一) 0 2012-05-08 07:00:04 随着移动互联网的发展,现在越来越多的应用开始想bs方向转移,原来很多复杂的计算逻辑也自然随着 ...
- java validation_java bean validation 参数验证
一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一个环节.比如参数不能为null,email那么必须符合email的格式,如果手动进行if判断或者写正则表达式判断无意开发效率太慢,在时间 ...
- java生成验证码并进行验证
一实现思路 使用BufferedImage用于在内存中存储生成的验证码图片 使用Graphics来进行验证码图片的绘制,并将绘制在图片上的验证码存放到session中用于后续验证 最后通过ImageI ...
- 来自国外高级Java架构师的采访总结
为了收集有关Java生态系统当前和未来状态的见解,我们与来自14家公司的高管进行了交流.我们首先问道:"从您的角度来看,Java的未来是什么?"以下是受访者告诉我们的内容: 无服务 ...
- java山寨qq账号密码验证_Java实战-山寨QQ
功能: 1.登录界面QQClientLogin.java,好友界面QQFriendList.java,聊天界面QQChar.java 2.当用户点击登录后,把账号密码发送给QQserver.java, ...
- Java微信公众号配置验证Token
Java微信公众号服务器配置-验证Token 一.填写服务器配置 首先我们需要在微信公众平台上填写服务器配置 重点内容 服务器地址URL(一定要外网能访问的到) 在我们提交配置的时候, ...
最新文章
- 使用python手写FFT算法
- tensorflow 显存 训练_【他山之石】训练时显存优化技术——OP合并与gradient checkpoint...
- 【计算机是如何通信 四】Web服务器/Severlet/DispatcherServlet/Controller
- 两种进入容器的方法 - 每天5分钟玩转 Docker 容器技术(23)
- LocalDate,LocalDate,LocateDateTime的常用方法
- IBATIS的优缺点
- pythoncontinue函数_Python continue语句
- 机器学习基础:核密度估计(Machine Learning Fundamentals: Kernel Density Estimation)
- 企业信息管理系统(1)_系统页面框架分析
- 高频量化交易之王--李庆在华尔街
- 配置阿里云maven仓库地址
- 汽车租赁管理系统(管理车辆基本信息、租车/还车、统计租金)
- android系统字体目录在哪个文件夹,安卓系统System目录下文件夹功能详解
- c语言 日期加减天数返回日期 闰年,日期计算器(多图)
- BurpSuite使用详解(三)Spider功能
- android 模拟滑屏,android模仿桌面左右滑屏
- web自动化测试 -- katalon recorder
- 无线蓝牙手表FCC ID认证测试项目有哪些?
- Android---简易Snackbar
- Excel表格的密码设置与取消