体验.NET Core使用IKVM对接Java

【导读】与第三方对接最麻烦的是语言不同,因语言不同内置实现相关标准加密算法还是略微有所差异

对接单点登录场景再寻常不过,由于时间紧迫且对接方使用Java,所以留给我对接开发和联调的时间本就不多,于是乎,在熬夜发版后,继而开始提前研究对接方所提供的加密方式大致处理

方案一(C#实现)

数据对接加密算法采用RSA SHA1 1024位、同时呢,在Java中对于1024或其他位数,对密文有长度限制,所以利用了分段加密,密文长度为117,解密长度为128,如此通用处理方式,网上肯定是可以搜索到的,截取加密部分片段,如下:

public static byte[] encryptByPublicKey(byte[] data, String publicKey) throws Exception {byte[] keyBytes = Base64.getDecoder().decode(publicKey);X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);Key publicK = keyFactory.generatePublic(x509KeySpec);Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicK);int inputLen = data.length;ByteArrayOutputStream out = new ByteArrayOutputStream();int offSet = 0;byte[] cache;int i = 0;while (inputLen - offSet > 0) {if (inputLen - offSet > 117) {cache = cipher.doFinal(data, offSet, 117);} else {cache = cipher.doFinal(data, offSet, inputLen - offSet);}out.write(cache, 0, cache.length);i++;offSet = i * 117;}byte[] encryptedData = out.toByteArray();out.close();return encryptedData;}

当然对于密钥在从证书中导出来肯定是二进制的,那么各个对接方最后转换为字符串方式有多种,比如base64、再比如转换为16进制等等,大同小异,这里就不展开了

了解完Java完整代码实现,我们需要对相关业务参数利用对接方所提供的公钥进行加密从而形成签名,以此请求时,将我们本地生成的公钥传递过去,在响应后进行验签,然后通过私钥解密

好了,讲到这里,我们假设已经本地生成证书,然后我们导出RSA公钥和私钥,伪代码如下:

var certificate = new X509Certificate2("pfx_path", "password", X509KeyStorageFlags.Exportable);var rsa = certificate.GetRSAPrivateKey();var privateKey = rsa.ExportRSAPrivateKey();var publicKey = rsa.ExportRSAPublicKey();

那么我们如何利用对接方公钥进行加密呢?接下来在.NET Core中实现就需要解决上述加密算法出现的两个问题

1. Java中可以通过RSA密钥(公钥或私钥)字符串转换为RSA密钥类,.NET Core提供了?

2. 获取到RSA密钥类,调用对应实例doFinal方法进行分段加密,那么是否可以通过.NET Core中的RSA加密方法,也分段加密,结果是否一致?对接方通过公钥字符串加载RSA 公钥,代码如下:

public static RSAPublicKey loadPublicKeyByStr(String publicKeyStr) {byte[] buffer = Util.hexToByte(publicKeyStr);KeyFactory keyFactory = KeyFactory.getInstance("RSA");X509EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);return (RSAPublicKey) keyFactory.generatePublic(keySpec);}

然后稍微查看了下加载类的解释

011eda242e8e114ad1b598529fc2a06c.png


所以我依图索骥,于是乎,大致有了如下模样

var servicePublicKey = "123456";var rsa = RSA.Create();rsa.ImportSubjectPublicKeyInfo(Encoding.UTF8.GetBytes(servicePublicKey), out _);

好了,目前通过导入公钥主题信息貌似拿到了RSA,接下来则是分段加密,上述方法中cipher.doFinal,应该是指定算法实例的加密处理,那我们首先截取对应数据的分段,然后调用rsa的Encrypt方法,那加密填充模式是否一致,不得而知,默认如下提供为PKCS1?

var servicePublicKey = "123456";var plainTextData = Encoding.UTF8.GetBytes("jeffcky");var rsa = RSA.Create();rsa.ImportSubjectPublicKeyInfo(Encoding.UTF8.GetBytes(servicePublicKey), out _);var outputStream = new MemoryStream();
var inputLen = plainTextData.Length;
int offSet = 0;
int i = 0;
while (inputLen - offSet > 0)
{Span<byte> bytes = plainTextData;byte[] encryptData;if (inputLen - offSet > 117){Span<byte> slicedBytes = bytes.Slice(start: offSet, length: 117);encryptData = rsa.Encrypt(slicedBytes.ToArray(), RSAEncryptionPadding.Pkcs1);}else{Span<byte> slicedBytes = bytes.Slice(start: offSet, length: inputLen - offSet);encryptData = rsa.Encrypt(slicedBytes.ToArray(), RSAEncryptionPadding.Pkcs1);}outputStream.Write(encryptData, 0, encryptData.Length);i++;offSet = i * 117;
}

一顿不知其结果的操作后,经调用对接方接口,响应验签失败,反复改了几版后,依然失败

方案二(IKVM)

不再过多深究其细节实现差异,采用稳妥方式借用IKVM直接在C#中复制对接方Java代码应该可以搞定(https://github.com/ikvm-revived/ikvm)


根据经验来看,我只用到加密,应该只需要用到IKVM.OpenJDK.Core和IKVM.OpenJDK.Security两个库,于是我们在nuget上下载.NET Framework实现版本,我使用的是.NET Framework 4.7.2,想想.NET Framework 4.6+可以适配.NET Standard,那是否也可以经过编译后,通过.NET Core添加程序集引用呢?

在.NET Framework 4.7.2引入上述核心库后,在控制台测试验证加密、验签一点问题都么有,好了,接下来则是将其编译,在.NET Core 3.1中添加程序集进行调用,加载程序集方法时直接抛出大致如下异常

FileNotFoundException: Could not load file or assembly 'System.Configuration.ConfigurationManager, Version=4.0.3.0, Culture=neutral, PublicKeyToken=cc7b13ffcd2ddd51'. The system cannot find the file specified.

继续添加对应版本程序集,版本过低,在nuget上根本找不到,涉及到.NET Core基础设施,看是否在github runtimes仓库能否找到对应issue

0c4d68d02c21eed04f82f397d8093a09.png

解决了上述程序集问题,接下来再次运行,又来其他异常,.NET Core版本IO加载文件该方法已被剔除

0ec37cd96f8b22f08e4b7bbc6911fb4a.png

坑一波接着一波,看来使用.NET Core引用.NET Framework程序集此路行不通,而且这仅仅只是在windows下测试,发布到linux上出现的问题无法预知,我再次翻了下,居然发现了.NET Core分支,惊喜不惊喜,查看分支就可以知道已有老外在处理迁移到.NET Core版本,只是还处于未发布状态

fad525be5971b3739710af93b40b8530.png

适配.NET Core链接《(https://github.com/ams-ts-ikvm/ikvm-bin/tree/net_core_compat/bin)》

如果只是用到相关加密,只需引用上述链接bin目录下,如下库即可

c266395ad12e88017213e4f1e252f62e.png

最后,添加包以及版本(System.Configuration.ConfigurationManager),如下:

0f4e03026bcbfa420be617b54723eb8e.png

经过上述一番折腾过程,终于对接上,耗时一天多,真尼玛是不容易,搞完一个字,累的一pa38732b5831c5f1bd68f73998e54fc27.png

💡 使用还未发布适配.NET Core的IKVM,在仅有时间内,快速对接上了Java加密,如若后续再遇到类似比较耗时耗力的加密方式,还不如使用IKVM,将更多时间花在处理业务逻辑上才是正道

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/295201.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对硕士而言,编制和稳定究竟有多重要?

随着考研大战如火如荼&#xff0c;2021研究生报考数目再创新高&#xff0c;越来越多的学生选择继续深造&#xff0c;进入更高的学府&#xff0c;为自己的学历镀金。然而现实是&#xff0c;很多的人毕业后并不一定比本科生拥有明显的优势&#xff0c;包括在体制内的工作&#xf…

无需Windbg | 使用VS 2019调试.NET程序的Crash异常

前言某台服务器上的IIS应用程序池&#xff0c;最近经常会自动关闭。查看服务器上的事件日志&#xff0c;发现在关闭时&#xff0c;w3p.exe抛出了stackoverflow异常。幸好&#xff0c;Windows自动帮我们抓取了Crash的dump文件&#xff1a;一般来说&#xff0c;我们会使用windbg来…

被夸了几十年,地球都要因为它变秃了,你还天天用它......

全世界只有3.14 % 的人关注了爆炸吧知识纸袋的流行不是环保要的结果模友们&#xff0c;“限塑令”在中国已经实行12年了&#xff0c;惊讶不&#xff1f;经过12年的努力&#xff0c;塑料袋终于不在大街上明目张胆的漫天飞舞。超模君相信大家都有一个共同认知&#xff1a;塑料袋污…

Dubbo与Zookeeper、SpringMVC整合和使用(负载均衡、容错)(转)

互联网的发展&#xff0c;网站应用的规模不断扩大&#xff0c;常规的垂直应用架构已无法应对&#xff0c;分布式服务架构以及流动计算架构势在必行&#xff0c;Dubbo是一个分布式服务框架&#xff0c;在这种情况下诞生的。现在核心业务抽取出来&#xff0c;作为独立的服务&…

孤掌难鸣-------堵水眼

序言: 一口水平井&#xff0c;井斜已经52度&#xff0c;方位在水平井的连线方向上。此段为增斜段&#xff0c;多次钻具组合的调整就为了正钻轨迹符合设计轨迹。然而在更换钻具组合下到底后&#xff0c;出现了两趟钻“堵水眼”的现象&#xff0c;第一次运气好顶开&#xff0c;而…

技术分享 | 一条神奇的曲线——贝塞尔曲线在前端的应用

源宝导读&#xff1a;在前端的开发中我们经常会遇到利用贝塞尔曲线帮助我们完成前端的动画和图形绘制&#xff0c;但是对其中的一些参数配置是一头雾水。本文将从贝塞尔曲线的原理讲起&#xff0c;由浅入深剖析一阶到多阶贝塞尔的实现原理&#xff0c;最后从三个方向来介绍它的…

女生来大姨妈该怎么哄她?

1 这捞人速度&#xff01;▼2 老师&#xff1a;我怀疑你在内涵我&#xff01;&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼3 就很出戏&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 分手到底有多痛苦&#xff1f;▼5 家长会上看到的纸…

OAuth 2.1 的进化之路

背景2010年, OAuth 授权规范 1.0 (rfc 5849) 版本发布, 2年后, 更简单易用的 OAuth 2.0 规范发布&#xff08;rfc 6749&#xff09;, 这也是大家最熟悉并且在互联网上使用最广泛的版本, 在2012年的时候, iPhone 5 是全新的, 微软最新的浏览器还是 IE9, 单页面应用在当时还被称作…

中科院超牛的物理学家,摇滚界无人不知的“李白”,你一定听过他的歌!

全世界只有3.14 % 的人关注了爆炸吧知识一个热爱音乐的科研工作者最近&#xff0c;有不少模友在后台问&#xff0c;如何如何去平衡好学习/工作和兴趣爱好之间的关系&#xff1f;很多人会说这么简单的问题&#xff0c;为什么还要问&#xff1f;其实并不简单&#xff0c;在现实生…

Nginx源码安装及应用

一&#xff1a;Nginx简介&#xff1a; Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器。在高连接并发的情况下&#xff0c;Nginx是Apache服务器不错的替代品。 Nginx作为负载均衡服务器&#xff1a;Nginx 既可以在内部直接支持Rails和PHP 程序对外进行服务&…

宝藏好物gRPCurl

gRPCurl简介gRPCurl[1]是一个与gRPC服务器交互的命令行工具&#xff0c;可认为是gRPC的curl工具。gRPCurl用于从命令行调用gRPC服务器支持的RPC方法&#xff0c;gRPC使用二进制编码(protobuf), 不能利用常规的curl工具(早期的curl版本还不支持HTTP/2)。1. gRPCurl工具接受json编…

你的输入法都暴露了些啥?

1 三哥对柠檬茶下手了要不要来一杯&#xff1f;▼2 能成功求婚的应该就是真爱了吧&#xff1f;▼3 气泡的花样玩法▼4 很正确&#xff1f;▼5 高手过招&#xff01;牛▼6 幽默中带着点死亡气息▼7 输入法&#xff1a;我暴露了一切▼你点的每个赞&#xff0c;我都认真当成了…

从 ThreadLocal 到 AsyncLocal

前些天跟大佬们在群里讨论如何在不使用构造函数&#xff0c;不增加方法参数的情况下把一个上下文注入到方法内部使用&#xff0c;得出的结论是 AsyncLocal 。感叹自己才疏学浅&#xff0c;居然才知道有 AsyncLocal 这种神器。于是赶紧恶补一下。ThreadLocal 要说 AsyncLocal 还…

Sersync+Rsync 增量实时同步

准备环境&#xff1a; rsync服务器&#xff1a;172.16.3.21sersync2服务器&#xff1a;172.16.3.23一、 rsync服务器先把原来的rsync包删掉yum remove rsync-2.6.8-3.1 -y,然后到http://rsync.samba.org/下载rsync包我用的包如下图所示利用securecrt上传本地[rootacong tongbu1…

浅谈RBF函数

所谓径向基函数 (Radial Basis Function 简称 RBF), 就是某种沿径向对称的标量函数。 通常定义为空间中任一点x到某一中心xc之间欧氏距离的单调函数 , 可记作 k(||x-xc||), 其作用往往是局部的 , 即当x远离xc时函数取值很小。 最常用的径向基函数是高斯核函数 ,形式为 k(||x-xc…

一个彻底改变世界的思想

全世界只有3.14 % 的人关注了爆炸吧知识因随机性的到来阔然开朗蒙特卡罗赌场蒙特卡罗&#xff08;Monte Carlo&#xff09;是摩纳哥公国&#xff08;Principality of Monaco&#xff09;的一座城市。摩纳哥公国坐落在法国的东南方&#xff0c;总面积为2.02平方公里&#xff0c;…

Cookies

一&#xff0c;前言 Cookies想必所有人都了解&#xff0c; 但是未必所有人都精通。本文讲解了Cookies的各方面知识。 二&#xff0c;基础知识 1.什么是Cookies Cookie 是一小段文本信息&#xff0c;伴随着用户请求和页面在 Web 服务器和浏览器之间传递。Cookie 包含每次用户访问…

用字符串表达式访问JSON数据(java,fastjson)

2019独角兽企业重金招聘Python工程师标准>>> //单元科技-www.ccell.com.cn 技术部,开源 //XML数据有XPATH 如"root/rows[id1]/name" //在JS中JSON数据可以对象方式访问 //java中怎么 用字符串表达式访问JSON数据? 找了很久没有找到,自己写一个,以减小代…

怎样分辨谁才是朋友圈里的真·贵族?

不是我不明白&#xff0c;这世界变化快但在这个看1分钟视频都要2倍速的世界里有一群人却仍然愿意每天花5分钟阅读2000字以上的文字信息这是多么高贵的一种精神所以高贵的你&#xff0c;值得更好的内容今天我们精选出8个优质公号他们有趣有料、有思想有温度绝对值得你的关注长按…

Android之如何解决Android studio运行出现的HAX kernel modules is not installed

HAX kernel modules is not installed 很久之前,我安装了Android studio,运行时控制台打印出这个,emulator:ERROR:x86 emulation currently requires hardware acceleration! Please ensure Intel HAXM is properly installed and useble, CPU acceleration statis:HAX kern…