2016-08-14 98 views
-1

我在我的应用程序中有Facebook和Google登录,我使用我的后端服务器来存储有关用户的数据,例如名称和状态。安全地与后端服务器通信

我发送的令牌旁边有一些信息,如用户点,服务器使用令牌标识用户,并且他的工作很好。

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

我的想法是引起一个RSA密钥对,将私人保存在一个安全的地方,并在apk中公开。

我可以很容易地在我的应用程序中使用rsa生成加密和解密,但我不是php的专家我尝试了很多东西来解密服务器端的东西,但我不知道该怎么做它。

我已经由Android生成一个密钥对,我也用过,

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

如何,如果在PHP中使用的私钥来解密和加密数据?

我知道这可能不是做事情的最佳方式,但我认为我不会有问题,目标受众远非黑客。

+0

“我想加密的一切”是什么意思?传输中的数据,设备中的数据,服务器上的数据,还有其他内容? – zaph

+0

在运输过程中,这是为了避免令牌盗用或分数操纵,我有一个带有令牌和分数的json数组,我希望能够在传输过程中保护这一点,我可以在手机上加密,但我无法在服务器中解密 –

+0

然后正确答案是HTTPS。有[让我们加密](https://letsencrypt.org/),有点更新或支付证书的麻烦,这是安全性的代价。还pi防止MITM攻击的证书。安全既不是免费的,也不容易,但你的用户应该得到它。 – zaph

回答

1

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

+0

从我正在阅读我认为我需要shell访问来安装这个,我没有它,我可以升级到更好的服务器在未来,但现在我坚持与基本的Linux托管 –

+0

@TiagoOliveira选择是你的成本与用户的安全。如果您不打算提供HTTPS安全性,请明确告诉用户他们的登录不安全,因为您无法承担。 – zaph

0

我想我achived我是特林做,登录由Facebook的100%手柄,通过HTTPS谷歌,我只在我的服务器使用令牌身份用户并增加得分

1令牌和比分被加密并发送至服务器
2-使用服务器查找单词和我使用HTTPS进行到Facebook或谷歌调用来检索用户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。