安全地与后端服务器通信

时间:2016-08-14 03:47:14

标签: php android encryption

我在我的应用程序中有Facebook和Google登录,我使用后端服务器存储有关用户的数据,例如姓名和状态。

我发送令牌旁边有一些信息,比如用户点,服务器使用令牌识别用户并完成他的工作。

在发布应用程序之前,我想加密一切,我知道我可以使用SSL,但是我的提供商为SSL支持收取了很多钱。

我的想法是创建一个RSA Keypair,将私人保存在一个安全的地方,并让公众进入apk。

我可以非常轻松地在我的应用程序中使用rsa生成加密和解密,但我不是php的专家我尝试了很多东西来解密服务器端的东西,但我无法弄明白怎么做。

我有一个由Android生成的Keypair,我用过,

getPublic().getEncoded()
getPrivate().getEncoded()

如果使用php中的私钥来解密和加密数据怎么办?

我知道这可能不是最好的做事方式,但我认为我不会遇到问题,目标受众与黑客相距甚远。

2 个答案:

答案 0 :(得分:1)

因为你添加了标签PHP,我假设你有一些你正在从你的Android应用程序调用的休息api运行。现在你不需要在PHP中加密和解密。这些由您的Web服务器处理。至于ssl看看let's encrypt是开源的。在Web服务器上单独执行ssl是非常好的安全措施。

答案 1 :(得分:0)

我认为我实现了我要做的事情,登录是由Facebook和谷歌通过https 100%处理,我只使用令牌来识别我的服务器中的用户并增加分数

1-令牌和分数被加密并发送到服务器
2-使用私钥,服务器找到令牌,我使用https拨打Facebook或Google来检索用户ID并增加分数

请注意,我服务器中存储的所有数据都是100%公开的,我不会存储有关任何人的私人信息,我只想保护令牌,如果有人获得令牌并开始进行大量调用可能达到每个用户200个电话/小时的facebook限制,使我的应用程序无法运行。

我将来会升级到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。