我的应用程序中有Facebook和Google登录,我使用后端服务器存储有关用户的数据,如姓名和状态。
我正在发送令牌以及一些信息,如用户点,服务器使用令牌识别用户并正常工作。
在发布应用程序之前,我想加密所有内容,我知道我可以使用SSL,但是我的提供商为SSL支持收取了很多钱。
我的想法是生成一个RSA密钥对,将私钥保存在安全的地方,并将公钥保存在apk中。
我可以很容易地在我的应用程序中使用rsa生成加密和解密,但我不是php专家,我尝试了很多东西在服务器端解密的东西,但我不能弄清楚如何做到这一点。
我有一个由android生成的Keypair,我使用,
getPublic().getEncoded()
getPrivate().getEncoded()
如何使用私钥在php解密和加密数据?
我知道这可能不是最好的方法,但我认为我不会有问题,目标受众真的远离黑客。
因为你添加了标签PHP,我假设你有某种类型的rest api运行,你从你的android应用程序调用。现在你不需要加密和解密在PHP。这些都是由你的网络服务器处理的。就ssl而言,看看let's encrypt,它是开源的。
我想我实现了我想做的事情,登录是100%由facebook和谷歌通过https处理,我只使用令牌来识别我的服务器中的用户并增加分数
1-令牌和分数被加密并发送给服务器
2-使用私钥服务器找到令牌,我使用https呼叫Facebook或谷歌检索用户id和增加得分
请注意,存储在我的服务器上的所有数据都是100%公开的,我不存储任何人的私人信息,我只是想保护令牌,如果有人得到令牌并开始打很多电话,它可能会达到facebook的限制,每个用户200个电话/小时,使我的应用程序无法操作。
我将在未来升级到SSL,当我开始从应用程序中赚取收入时
AndroidString pubKeyPEM = "***";
public void something(){
String sendToServer = Base64.encodeToString(RSAEncrypt("test"),0);
}
public byte[] RSAEncrypt(final String request) throws Exception {
PublicKey publicKey = getPublicKey();
cipher = Cipher.getInstance("RSA/None/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
return cipher.doFinal(plain.getBytes());
}
public PublicKey getPublicKey() throws Exception {
PublicKey publicKey;
byte[] decoded = Base64.decode(pubKeyPEM, Base64.DEFAULT);
KeyFactory kf = KeyFactory.getInstance("RSA");
publicKey = kf.generatePublic(new X509EncodedKeySpec(decoded));
return publicKey;
}
PHP $privkey = '-----BEGIN RSA PRIVATE KEY-----';
function decrypt($data){
global $privkey;
if (openssl_private_decrypt(base64_decode($data), $decrypted, $privkey))
$data = $decrypted;
else
$data = '';
return $data;
}
私钥将被移动到一个更安全的地方,但这是工作正如我想要的
我的服务器也检查令牌是否由我的应用程序id生成,所以如果有人试图使用不同的令牌,它将显示一个不同的应用程序id。