java - 在 Android、iOS 和 Java (SPRING) 服务器上支持 RSA 加密
问题描述
我们有一个系统,其中包括 Android 和 iPhone 应用程序以及后端服务器。应用程序可以相互发送某些敏感信息。为了做到这一点,他们在登录时生成一个密钥对并将公钥发送到服务器。然后,服务器使用该公钥加密敏感数据,只有接收应用程序才能使用其私钥对其进行解密。我们目前已为 Android 启动并运行它,但在 iPhone 上遇到问题。我已经看了一遍,看到了一些建议,但似乎无法解决它。
公钥作为 base64 编码字符串发送到服务器并存储在服务器上,供服务器端使用
byte[] publicKeyBytes = Base64.decodeBase64(base64EncodedPublicKey);
X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PublicKey publicKey = kf.generatePublic(keySpec);
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.ENCRYPT_MODE, key);
return cipher.doFinal(rawStringToEncrypt.getBytes("UTF-8"));
这适用于 iOS 和 Android。在 iOS 上生成公钥时,我们需要在将其发送到服务器之前手动添加 ASN1 标头等。但是服务器现在接受从 iOS 发送的密钥并使用它们进行加密(那里一切看起来都不错)。当 Android 应用程序接收到加密数据时,它只会执行
byte[] privateKeyBytes = Base64.decodeBase64(base64EncodedPrivateKey.getBytes("UTF-8"));
PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyBytes);
KeyFactory kf = KeyFactory.getInstance("RSA");
PrivateKey privateKey = kf.generatePrivate(keySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.DECRYPT_MODE, key);
String decryptedString = new String(cipher.doFinal(toDecrypt), "UTF-8");
return decryptedString;
它从生成其密钥对时获得的存储的 base64 字符串创建其私钥。然而,对于 iOS,我们尝试了大量不同的解决方案,但始终无法解密服务器使用我们的公钥加密的数据。我们生成 KeyPair,操作公钥,以便我们可以将其发送到服务器,然后存储我们的私钥。我们从我们的钥匙串中获取 SecKeyRef(也尝试将其存储为字节并从字节创建它)并SecKeyDecrypt
使用该密钥执行并测试kSecPaddingPKCS1
了kSecPaddingNone
.
有没有人有一个可行的解决方案来解密Java服务器按照我描述的方式加密的数据?
解决方案
推荐阅读
- powershell - PowerShell Active Directory 登录脚本自动构建
- javascript - 根据 URL 更改幻灯片
- c# - 如何跳过默认控制器的 url 中的控制器?
- c# - 将字节数组保存到 SQLite 数据库 c#
- android - 使用带有 selenium 和 appium 的 browserstack 自动化时,在浏览器中单击 android 权限
- elasticsearch - 创建弹性搜索查询
- android - 在 APK lib/x86/librealm-jni.so 中复制的重复文件 - 与 ~/.gradle/cache 中的缓存冲突
- regex - WPF 正则表达式特殊字符“&”语法不正确
- python - odoo如何通过更新另一个字段的值来更新一个字段的值,两个字段都在不同的类中
- c# - 无法正确停止 c# 中的所有线程