我正在开发一款Android应用。该应用程序通过PHP API与服务器通信。每个用户都必须创建一个帐户。因此,该应用程序具有登录功能。我正在进一步研究如何在客户端(Android应用程序)和服务器之间安全地传输数据。例如,用户通过POST发送请求其用户名/密码以便登录。
根据我所读到的内容,我可以放心地假设,如果有人“监听”客户端和服务器之间的交易,他可以窃取用户名/密码组合并使用它来登录合法用户的帐户。这是对的吗?
此问题的解决方案是在从客户端或服务器发送数据之前加密数据(例如用户名和密码)。然后,数据将由接收方(客户端或服务器)解密。我通过在客户端(用Java编写)和服务器(用PHP编写)上使用crypt / decrypt函数来做到这一点。每个函数都有相同的IV(初始化向量)和密钥(说实话,我不太了解IV的用法,所以请原谅我,如果我说错了。我谷歌周围的信息,但任何有用的链接将非常感激)
从我读到的,这个实现的问题是APK文件可以从客户端反编译并获得IV和密钥。因此,侦听器可以解密发送的数据。这是对的吗?
试图找到这个问题的解决方案我有一个建议,我想你的意见。如果在用户注册期间向每个用户提供唯一的IV和密钥,该怎么办?这些值存储在MySQL数据库(服务器端)和SQLite数据库(客户端)中。每当需要通过post请求发送数据时,用户的id(可以是简单的整数)和要发送的数据使用单个用户的唯一IV / Secret Key加密。这些存储在本地,因此“监听器”无法访问它们。即使他反编译APK,他也只能访问他已经知道的自己的IV /密钥。然后在服务器端使用存储在服务器上的相同IV /密钥对数据进行解密。数据从服务器发送到客户端时应用相同的过程。
这是正确的做法吗?
答案 0 :(得分:2)
重复使用相同的对称密钥和相同的IV是非常不正确的方法,不得使用。
重复使用相同的密钥和IV将启用攻击,攻击者将能够恢复您的密钥,只需窃听加密流量足够长的时间。当攻击者拥有您的密钥时,他将能够解密所有过去和未来的通信。
为确保数据传输安全,您应该使用HTTPS(如果您的数据传输协议不是基于HTTP的,则直接使用SSL / TLS)。
答案 1 :(得分:0)
如果您唯一关心的是与服务器安全通信,我建议您在服务器上安装ssl证书。通过这种方式,通信将由底层协议保护。为了方便您与服务器进行通信以实现ssl通信,我建议您使用aquery库,这里是a link!。 也不要忘记看到Android的ca兼容性列表。
希望它有所帮助。
答案 2 :(得分:0)
这是一个相当古老的问题所以我很惊讶它没有更完整的回复。您似乎理解对称加密的概念,但您缺少公钥/私钥加密的知识。查找RSA以获取实现公钥/私钥加密的方法。通过这种方式,您可以在每个会话开始时(通过加密安全RNG的帮助)生成新的随机密钥和IV,以提供给您的对称加密系统。这意味着任何从头到尾收听的人都无法理解你的系统没有强制RSA密钥或symetric(AES?)密钥的暴力。