【问题标题】:Security in Android - Google app engine systemAndroid 中的安全性 - 谷歌应用引擎系统
【发布时间】:2013-06-19 17:21:04
【问题描述】:

所以我有一个 android 应用程序和一个用 python 编写的谷歌应用程序引擎服务器。 android 应用需要向服务器发送一些明智的信息,我这样做的方式是通过 http post。

现在我一直在考虑在发送数据之前在 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;
    }

这就是我尝试在服务器上解密的方式(我还不知道如何进行加密..也许你们也可以帮忙)

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

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

    return msg

当我查看日志时,我得到的字符串测试是:xVF79DzOplxBTMCwAx+hoeDJhyhifPZEoACQJcFhrXA=,因为它不是 16 的倍数(为什么,我猜这是因为 java 加密)我得到了错误

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

我做错了什么?

【问题讨论】:

  • 你为什么不使用 ssl(又名 https)?这应该提供在手机和 App Engine 之间安全、私密地传输数据所需的所有加密。
  • @Fh。任何教程/资源,我会看到如何做到这一点?我是个新手 :)
  • 更长的答案添加为答案:)

标签: java android python google-app-engine pycrypto


【解决方案1】:

你为什么不使用 ssl(又名 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

【讨论】:

  • 非常感谢...如果我有 python 服务器,这还能用吗?
  • 我同意这个建议,但请注意对 GAE 的影响。如果我没记错的话,在您自己的域上使用 HTTPS 会产生成本问题(不确定当前状态如何):developers.google.com/appengine/docs/ssl
  • Tom - 请注意链接转到“自定义域”支持。对于 vanilla *.appspot.com 域,它是免费的(在配额限制内)。 developers.google.com/appengine/kb/general#https
  • @Fh。所以如果我想拥有一个自定义域 (myapp.com),我需要为 HTTPS 付费(并且隐式地为自定义域上的 clound 端点付费)? You must have an App Engine application with billing enabled that has cleared at least one billing charge; use this application when enabling SSL. 如果答案是肯定的,那么我想我会通过端点,直到我的应用程序取得一些成功,并且我将有理由向它投入更多资金:)。如果我错了,请纠正我:)
  • @Fh。还有一个问题,当我发布到服务器时,我还发送了一个密钥(作为发布的数据),并且我在服务器端验证了该密钥。我基本上要做的是验证帖子是由我的android应用程序制作的,而不是其他知道要发布什么以及在哪里发布的人......但是如果有人可以看到我的源代码,他们就可以看到两个关键,以及在哪里发布的链接...例如,他可以发布垃圾邮件...端点在这里有帮助吗?
【解决方案2】:

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

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

Base64 编码被广泛用于许多应用程序,它是将二进制数据编码为文本的好方法。如果您正在查看长编码值,则末尾的“=”可以很好地指示 base64 编码。

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

我有两个建议:

  1. 如果加密不是您的舒适区,请咨询在该领域擅长您项目的人。

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

【讨论】:

  • @Teshte 没有。这里有很多关于这个的讨论。简单的规则。如果确实需要安全,请不要将其放在手机上。
  • 一种选择是在用户设置期间将唯一的对称密钥推送到应用程序。您需要在服务器端跟踪这些密钥,以便知道哪个密钥属于哪个用户。在应用方面,您应该查看 Android 文档,了解应用机密的正确存储位置。
  • @u2702 所以我的应用程序的想法是我想将数据加密到最低限度,这样如果用户使用被扫描的公共 wifi 网络,他的姓名和电话就不会出现那人。为了让他获得它们(根据我对您的理解),他需要获得我的 apk(并从那里获得源代码和我使用的密钥)。但是,如果此人使用他的移动网络中的应用程序,则没有风险,除非 CIA 想要该消息 :)。感谢您的帮助。对于我的应用程序的版本 1,我可能会保持原样,下一个版本将通过某种方式提高安全性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多