与后端服务器安全通信


Communicate with backend server securely

我的应用程序中有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,当我开始从应用程序中赚取收入时

Android

String 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。