java 消息摘要_java – 使用BouncyCastle签名消息摘要
在C#的那一刻,我正在签署这样的挑战:
RSACryptoServiceProvider rsa;
RSAPKCS1SignatureFormatter RSAFormatter = new RSAPKCS1SignatureFormatter(rsa);
RSAFormatter.SetHashAlgorithm("SHA1");
byte[] SignedHash = RSAFormatter.CreateSignature(paramDataToSign);
然后我将SignedHash提供给Windows,它接受它并且一切正常.但我需要将此部分移至Android,并且存在问题,即我无法获得相同的签名哈希值.
在Android中,我尝试制作签名哈希,但它们与C#中生成的哈希不同.
Signature signer = Signature.getInstance("SHA1withRSA", "BC");
signer.initSign(privateKey);
signer.update(paramDataToSign);
signer.sign();
在C#中 – 使用下面一段代码 – 我得到的结果与Android相同,但它不是一个选项,因为Windows不接受签名的哈希.
ISigner signer = SignerUtilities.GetSigner("SHA1withRSA");
signer.Init(true, privateKey);
signer.BlockUpdate(paramDataToSign, 0, paramDataToSign.Length);
signer.GenerateSignature();
这里写的是C#PKCS1SignatureFormatter和Java Signature应该给出相同的结果,但它们没有. http://www.jensign.com/JavaScience/dotnet/VerifySig/
可能是什么问题呢?
以下是我得到的基本64(WebSafe)值:
Challenge = zHyz12Tk4m151nssYIBWqBCAxhQ
RSAPKCS1SignatureFormatter SignedHash = kmu39keplCAV4Qnu22wdprLz4nGSsrVtHbxQ5YMUG7p-0YwReCG4ROIlFvYs4CGfjCiAGFPw4PLrLx7mrlAA6iuhJMkgm_PMTW9alQYTH612hLEUP4EmK0M2kw8CveLcjI3HA08z8bByllIzRyAlM8bcR438vw2uhx_CbgvOOHn8vwBPnvWbFqpi2doYoq2xEuFBRe7eBPrxbMRqEd3ExdQ9c9rYT4ivOJ4pbioyi6D5i5_1crvGwM6nQanMZCmooRYJO65NP3B4wWnvQZpJLRD0U08wWcvyGBFWp188ZovDjnkTQZku6lzmwGXfqQwtBz9uNvLcTbp7cVyt5EyQxw
Signature and ISigner SignedHash = Vt-b5QfGPnSPpZuIB8-H4N1K5hQXpImS4e8k56_HruDSqy3DLsz96QKUrccshjr1z9nTK3Mwvd5yPdyTJOqSUcDQqxV46LPhWQNsubqKxAz97ePpeslIH1gHdnzkh46ixsWqgDrhR7egQtDkU8PPsph1qahCxaVkRYspQBV0jPZ-LK4EjoGGnuWTCihVKjruXJZ2VY8yZ9QRAsHVptr0Nv-mldO2MFK-oEVbtVbHqUPf5So8im3oRSm68OqY4g56bCdFNSbhcFBjrZ1QPjnxiIk43-_5tevafqoOB2D_E_mQHCJwmRg3MrNij6IdAdloCejnhCWzgMHdcG1Ug_Qmig
编辑:
所以最简单的解决方案是使用Bouncy Castle API:
AsymmetricBlockCipher rsaEngine = new PKCS1Encoding(new RSABlindedEngine());
rsaEngine.init(true, privateKey);
DigestInfo dInfo = new DigestInfo(new AlgorithmIdentifier(X509ObjectIdentifiers.id_SHA1, DERNull.INSTANCE), paramDataToSign);
byte[] digestInfo = dInfo.getEncoded(ASN1Encoding.DER);
rsaEngine.processBlock(digestInfo, 0, digestInfo.length);
解决方法:
问题是RSAFormatter.CreateSignature(paramDataToSign);传递哈希值,而signer.update(paramDataToSign);在散列之前传递数据.因此,您可能必须删除Java代码的MessageDigest计算才能使其生效.
或者,如果您只有哈希值,则可以查看Bouncy Castle轻量级API以查找接受预先哈希值的方法.这可以使用新的RSADigestSigner(new StaticDigest(paramDataToSign,“SHA-1”)).generateSignature()来执行.
问题是StaticDigest不存在,所以如果你真的需要它,你必须在这里发表评论.替代方案,镜像RSADigestSigner的实现,但替换预先计算的哈希.
标签:c,java,cryptography,bouncycastle,digital-signature
来源: https://codeday.me/bug/20190623/1272204.html
java 消息摘要_java – 使用BouncyCastle签名消息摘要相关推荐
- java 微信模板_java开发微信模板消息推送
概述 微信公众平台开始支持前端网页,大家可能看到很多网页上都有分享到朋友圈,关注微信等按钮,点击它们都会弹出一个窗口让你分享和关注,这个是怎么实现的呢?今天就给大家讲解下如何在微信公众平台前端网页上添 ...
- java pgp 加密_java – 如何解密签名的pgp加密文件?
如何使用BouncyCastle Java API解密和验证使用PGP加密的文件? 解决方法: 加密代码: private static void encryptFile(OutputStream o ...
- java打架游戏_java模拟游戏打斗场景摘要.doc
java模拟游戏打斗场景摘要.doc //游戏人物属性模型 package dahuaxiyou; public class Immortal { public String name; public ...
- java消息 框架_java 框架-消息队列ActiveMQ
https://www.jianshu.com/p/ecdc6eab554c ActiveMQ从入门到精通(一) 22017.03.11 21:40:42字数 2650阅读 57286 这是关于消息中 ...
- java异步处理_Java编程开发好入门吗 消息队列的用途有哪些
Java编程开发好入门吗?消息队列的用途有哪些?消息队列是指能够提供消息排队消费功能的软件程序,是消息队列中间件的一部分.消息队列中间件是分布式系统中重要的组件.接下来就给大家讲解消息队列的优势.类型 ...
- java消息平台_Java微信公众平台之消息管理
Java微信公众平台开发之消息管理,一定要先看下官方文档 微信消息管理分为接收普通消息.接收事件推送.发送消息(被动回复).客服消息.群发消息.模板消息这几部分 一.接收普通消息 当普通微信用户向公众 ...
- java jms 消息服务_Java消息服务JMS详解
Java消息服务(JMS Java Message Services)提供了点对点模式(Point-to-Point Queue)和发布-订阅模式(Publish-Subscribe Topics). ...
- java发微信_java访问微信接口发送消息
最近在开发activiti流程的时候有个需求:流程到达每个审批节点后,需要向该节点的审批人发送一个消息,提示有审批需要处理. 参考了一下微信的开发者文档和网络上的一些技术博客,现在记录一下.以便后续继 ...
- java开发微信公众号-订阅号-消息接收,及返回给用户信息
创建java项目 1)导入依赖 pom.xml: <parent><groupId>org.springframework.boot</groupId><ar ...
最新文章
- (一)七种AOP实现方法
- KNN学习之图像分类与KNN原理
- linux sersync2 ssh start=true,rsync+nfs+sersync实战案例
- AngularJS笔记之创建服务方式比较 : factory vs service vs provider
- ASP.NET Core应用针对静态文件请求的处理[1]: 以Web的形式发布静态文件
- python 混淆矩阵_绘制混沌矩阵
- php input 数组的值,如何获取2值表单输入数组到PHP数组中(How to get 2 value form input array into PHP array)...
- 从服务器上传和下载文件方法
- 一分钟了解四层/七层反向代理
- antix linux安装教程,antiX 19.1 发布,轻量级的桌面Linux发行版
- Spring Boot 实际应用(三)发送邮件实现
- Sklearn专题实战——针对Category特征进行分类
- Lucene系列:番外篇-DocValues
- Ubuntu恢复官方默认源
- 使用邻接矩阵实现商品SKU表单联动
- 互联网金融指导意见或引发P2P跑路狂潮
- 【记录+解决】ubuntu服务器显卡驱动安装;Ubuntu20.04重启后找不到Nvidia显卡驱动
- 定时任务实现(中午12点执行,每1分钟执行一次)
- 还在问java架构师路线?学习路线?十年京东架构师教你这样做
- 【OSX】MAC下能用的炒股软件_我是亲民_新浪博客
热门文章
- 计算机系统的组成一般不包括,计算机系统的基本组成,一般应包括哪些
- 锂离子电池和燃料电池特性介绍
- S-Nim (HDU 1536)组合博弈SG多组游戏
- BAT文件的编写及使用
- 智能交通系统(ITS)的无线网络技术
- 十大优质外盘炒黄金平台排名
- 基于TIA博途SCL语言的设备累计运行时间FB函数库_具体方法及程序示例
- Unity之Failed to import package with error: Couldn‘t decompress package
- 【渝粤教育】广东开放大学 古代汉语 形成性考核 (28)
- 谷歌浏览器(Google Chrome)清除密码等缓存记录