2013-06-19 71 views
1

因此,我有一个Android应用程序和一个用python编写的谷歌应用程序引擎服务器。 Android应用程序需要发送一些合理的信息到服务器,我这样做的方式是做一个http发布。Android中的安全 - 谷歌应用程序引擎系统

现在我一直在考虑在发送它之前对android中的数据进行加密,并且一旦它在gae服务器上进行解密。

我这是怎么加密和Java中解密:

private static final String ALGO = "AES"; 



public static String encrypt(String Data) throws Exception { 
     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGO); 
     c.init(Cipher.ENCRYPT_MODE, key); 
     byte[] encVal = c.doFinal(Data.getBytes()); 
    // String encryptedValue = new BASE64Encoder().encode(encVal); 

     byte[] decoded = Base64.encodeBase64(encVal); 

     return (new String(decoded, "UTF-8") + "\n"); 
    } 

public static String decrypt(String encryptedData) throws Exception { 
     Key key = generateKey(); 
     Cipher c = Cipher.getInstance(ALGO); 
     c.init(Cipher.DECRYPT_MODE, key); 
     byte[] decordedValue =Base64.decodeBase64(encryptedData); 
     byte[] decValue = c.doFinal(decordedValue); 
     String decryptedValue = new String(decValue); 

     return decryptedValue; 

    } 

    private static Key generateKey() throws Exception { 
     Key key = new SecretKeySpec(Constant.keyValue, ALGO); 
     return key; 
    } 

而且这是我尝试解密的服务器上(我还不知道怎么办encryption..maybe你们可以与太帮助)

def decrypt(value): 
    key = b'1234567891234567' 

    cipher = AES.new(key, AES.MODE_ECB) 
    msg = cipher.decrypt(value) 

    return msg 

正如我在日志中望去,串测试,我得到的是:xVF79DzOplxBTMCwAx+hoeDJhyhifPZEoACQJcFhrXA=因为它不是16的倍数(IDK为什么,我想这是因为Java加密)我得到错误

ValueError:输入字符串必须是长度为16的倍数

我在做什么错?

+0

你为什么不使用SSL(HTTPS又名)?这应该提供在手机和App Engine之间安全且私密地传输数据所需的所有加密。 –

+0

@Fh。任何教程/资源,我会看到如何做到这一点?我是一种newby :) – Teshte

+0

更长的答案添加为答案:) –

回答

0

此字符串“xVF79DzOplxBTMCwAx + hoeDJhyhifPZEoACQJcFhrXA =”是一个base64编码值。

https://en.wikipedia.org/wiki/Base64

Base64编码被广泛用于许多应用程序,它的二进制数据编码为文本的好办法。如果您正在查看长编码值,最后的“=”可能是base64编码的一个很好的指标。

在您的python代码中,您可能需要base64解码数据,然后将其交给解密函数。

我有两个建议:

  1. 如果密码是不是对你的舒适区,与人谁是在这一领域的项目好商量。

  2. 请注意,在您发布的Android应用程序中嵌入对称加密密钥是一个坏主意。任何能够获取应用程序副本的人都可以提取该密钥并使用它来解密或欺骗您的消息。

+0

不是apk保护源代码?? – Teshte

+0

@Teshte no。关于这方面的大量讨论。简单的规则。如果确实需要安全,不要将它放在手机上。 – Simon

+0

一种选择是在用户设置期间将独特的对称密钥向下推送到应用程序。您需要跟踪服务器端的这些密钥,以便知道哪个密钥属于哪个用户。在应用程序方面,您应该查看适用于应用程序机密的正确存储位置的Android文档。 – u2702

2

为什么不使用ssl(aka https)?这应该提供在手机和App Engine之间安全且私密地传输数据所需的所有加密。

它的基本知识:代替发送数据到http://yourapp.appspot.com/,发送到https://yourapp.appspot.com/

要获得App Engine和Android之间完整的安全和已验证通道,您可以使用Google Cloud Endpoints。它甚至会生成Android侧代码来调用它。

的Java:

的Python:

对于更长的展示和说明,检查IO 13讲:https://www.youtube.com/watch?v=v5u_Owtbfew

+0

非常感谢...所以如果我有python服务器,这仍然可以工作吗? – Teshte

+0

是的,用python链接更新了答案 –

+0

我同意这个建议,但是要注意GAE的后果。如果我没有记错,那么在自己的域名上有HTTPS相关的成本问题(不知道当前状态是什么): https://developers.google.com/appengine/docs/ssl – Tom