当前位置: 首页 > 编程语言 > C#

如何使用rs256算法用自己的rsa私钥对字节进行签名?分享

时间:2023-04-11 02:21:15 C#

如何使用rs256算法用自己的rsa私钥对字节进行签名?我有自己的私钥符串,即-----BEGINRSAPRIVATEKEY-----MIICXAIBAAKBgQCSAYYgzvGTww................3yUMYj9oYzqdrRHP0XgD0cEEvyqPBwLaNsRdFwy5qTiHjj0f+ZWHQWmqcoLmmpzyZEbIvQm/VhbjRF6iKG4WZ9Hfa7ntYRNGdWgD/KMIeZI=-----ENDRSAPRIVATEKEY-----现在,我在C#中声明我的签名需要使用这个私钥生成JWT负载。我写了下面的代码:varutc0=newDateTime(1970,1,1,0,0,0,0,DateTimeKind.Utc);varissueTime=DateTime.Now;variat=(int)issueTime.Subtract(utc0).TotalSeconds;varexp=(int)issueTime.AddMinutes(55).Subtract(utc0).TotalSeconds;varpayload=new{iss=email,prn=prn,scope="scope",aud="https://example.com",exp=exp,iat=iat};变种段=新列表();varheader=new{typ="JWT",alg="RS256"};byte[]headerBytes=Encoding.UTF8.GetBytes(jsonSerializer.Serialize(header));byte[]payloadBytes=Encoding.UTF8.GetBytes(jsonSerializer.Serialize(payload));segments.Add(Base64UrlEncode(headerBytes));segments.Add(Base64UrlEncode(payloadBytes));var=stringToSignstring.Join(".",segments.ToArray());varbytesToSign=Encoding.UTF8.GetBytes(stringToSign);现在我需要这些bytesToSign由我的私钥签名,正如我上面提到的使用rs256算法。有人可以帮忙吗?我更新了我的代码如下:varpemprivatekey=OpenSSLKey.DecodeOpenSSLPrivateKey(privateKey);RSACryptoServiceProviderrsaProvider=newRSACryptoServiceProvider();如果(pemprivatekey!=null){rsaProvider=OpenSSLKey.DecodeRSAPrivateKey(pemprivatekey);}byte[]signature=rsaProvider.SignData(bytesToSign,"SHA256");segments.Add(Base64UrlEncode(signature));返回string.Join(".",segments.ToArray());并生成JWT令牌。请告诉我哪里出错了,因为它不正确:当我将它传递给API时,它不起作用并抛出错误。我最近不得不实现类似的东西,并在签署我的有效负载时收到错误“指定的无效算法”,因此为了解决我的具体问题,我想我应该分享代码。我认为这也可能对您有用。您可以在Karama.Jwt.Public找到完整的解释[ReadME][2]和源代码。我碰巧使用不同的库来生成我的JWT,即JOSE,但我认为这是偶然的,为了完整起见,有一个项目没有使用第3方库来达到相同的目的。请告诉我你过得怎么样。我将逐步列出我的答案为此,您需要安装一个包以获取名为Jose-jwt的库。这代表JavaScript对象签名和加密。从NuGet包管理器Install-packageJose-jwt使用OpenSSL以PKCS12文件(*.p12)的形式打包您的私钥,您将在此过程中为其设置密码。opensslpkcs12-export-nocerts-in./myKey.key-outmy-Key.p12如库自述文件中所列,您需要从此文件生成RSACryptoServiceProvider,如下所示:varprivateKey=newX509Certificate2("my-key.p12","密码",X509KeyStorageFlags.Exportable|X509KeyStorageFlags.MachineKeySet).PrivateKey作为RSACryptoServiceProvider;使用您在PKCS12打包期间设置的密码创建的RSACryptoServiceProvider对您的有效负载进行编码,如下所示:stringtoken=Jose。JWT.Encode(有效载荷,私钥,JwsAlgorithm.RS256);如果对任何人都有用,我找到了一些纯基于Javascript的解决方案。你可以在这里找到JS库。它解决了我的要求。以上是C#学习教程:如何使用rs256算法使用自己的rsa私钥对字节进行签名?如果所有分享的内容对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处: