我在我的应用程序中有Facebook和Google登录,我使用后端服务器存储有关用户的数据,例如姓名和状态。
我发送令牌旁边有一些信息,比如用户点,服务器使用令牌识别用户并完成他的工作。
在发布应用程序之前,我想加密一切,我知道我可以使用SSL,但是我的提供商为SSL支持收取了很多钱。
我的想法是创建一个RSA Keypair,将私人保存在一个安全的地方,并让公众进入apk。
我可以非常轻松地在我的应用程序中使用rsa生成加密和解密,但我不是php的专家我尝试了很多东西来解密服务器端的东西,但我无法弄明白怎么做。
我有一个由Android生成的Keypair,我用过,
getPublic().getEncoded()
getPrivate().getEncoded()
如果使用php中的私钥来解密和加密数据怎么办?
我知道这可能不是最好的做事方式,但我认为我不会遇到问题,目标受众与黑客相距甚远。
答案 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。