我得到了Web服务团队编写的这个C#代码,它公开了我计划使用的一些Web服务.我的密码需要使用此代码加密,以便Web服务知道如何解密它.
using(RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKey);
byte[] plainBytes = Encoding.Unicode.GetBytes(clearText);
byte[] encryptedBytes = rsa.Encrypt(plainBytes, false);
return Convert.ToBase64String(encryptedBytes);
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Java来使用这个Web服务,而且现在,我在将#C代码转换为Java代码时遇到了问题,因为该Web服务无法正确解密我的密码.
这是我目前失败的尝试: -
// my clear text password
String clearTextPassword = "XXXXX";
// these values are provided by the web service team
String modulusString = "...";
String publicExponentString = "...";
BigInteger modulus = new BigInteger(1, Base64.decodeBase64(modulusString.getBytes("UTF-8")));
BigInteger publicExponent = new BigInteger(1, Base64.decodeBase64(publicExponentString.getBytes("UTF-8")));
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
RSAPublicKeySpec publicKeySpec = new RSAPublicKeySpec(modulus, publicExponent);
PublicKey publicKey = keyFactory.generatePublic(publicKeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding"); …Run Code Online (Sandbox Code Playgroud) 我提前为这篇文章的篇幅道歉.我真的不太了解这个问题,无法正确识别具体问题实际上是什么!但无论如何,我们已经做出有悖于我们的会员API调用,查询有关我们的会员信息(加入日期,会员类型等)使用@Leigh提供的步骤和建议,在这里,他们一直在努力太棒了!再次感谢Leigh,我们的会员非常高兴能够做到这一点!
现在我想为我们的会员设置单点登录,允许他们在我们的页面登录,然后被提交到他们已经登录该网站的会员资料.根据API文档,我需要做的一件事是:
"使用签名证书签署登录人员的Portal用户名."
我完全坚持这个.我在表单中获得了一个XML私钥(由他们的.NET应用程序生成)
<RSAKeyValue><Modulus>{stuff}</Modulus><Exponent>{stuff}</Exponent><P>... etc etc
Run Code Online (Sandbox Code Playgroud)
我认为我无法直接使用此格式,必须将其转换为PEM格式或类似格式.使用OpenSSL,我想我已经完成了这个,现在有一个格式为"----- BEGIN PRIVATE KEY ----- {stuff} ----- END PRIVATE KEY -----"的文件.
使用Leigh的解决方案确实给了我一个签名,但它与API文档中提供的示例不匹配.我认为这是因为它使用HmacSHA1,而他们注意到"标题中的签名使用HMAC SHA1而创建安全令牌的签名使用公钥/私钥对和RSA-SHA1.同样的方法不能用于生成两者. " 我试过改变
<cfset key = key.init(jKey,"HmacSHA1") />
Run Code Online (Sandbox Code Playgroud)
至
<cfset key = key.init(jKey,"RSA-SHA1") />
Run Code Online (Sandbox Code Playgroud)
得到"算法RSA-SHA1不可用".
我曾尝试复制和粘贴其他一些建议的解决方案,但它们都不起作用.一个例子(来自12Robots.com):
<!--- Create a Java Cipher object and get a mode --->
<cfset cipher = createObject('java', 'javax.crypto.Cipher').getInstance("RSA") />
<!--- The mode tells the Cipher whether is will be encrypting or decrypting --->
<cfset encMode = cipher.ENCRYPT_MODE />
<cfset encryptedValue = …Run Code Online (Sandbox Code Playgroud) encryption coldfusion cryptography single-sign-on private-key