我正在创建一个巨大的在线手机游戏。我有几个问题要问你们,因为我在密码学和安全地通过网络发送数据方面的知识有点差。
一些细节:
- 每个用户都有一个帐户
- 要登录,您必须提供您的用户名和密码(通过应用程序,而不是网络浏览器)
- 数据从客户端(移动设备)传输到某处的服务器。
简单的!好的,据我所知,正常的 Web 身份验证由 SSL 保护,这只是“发送纯文本,您是安全的”。
在移动设备上,我无法使用 SSL(即使 Android 提供了一些方法,我也无法将我的游戏移植到 iOS,使用不同的游戏/网络引擎等)。
我必须使“发送和接收”过程安全,这样第三个人就不会捕获用户的凭据。
正如我所读到的,执行此操作的最佳方法是RSA方法,它使用公钥和私钥来加密/解密数据包。
据我所知,它的工作原理如下:
- 有两个密钥,私有、公共和消息:“消息”。
- 任何人都可以获得公钥(因为它是公开的)
- 只有服务器有权访问私钥
- 任何人都可以用公钥加密“消息”,它看起来总是一样的(用相同的公钥加密的相同消息)
- 加密的消息只能以一种方式解密 - 使用私钥,它看起来像第一条消息:“消息”。
- 公钥和私钥不相等,但它们使用不同的加密/解密算法,所以它神奇地工作,最后消息是相同的
如果我错了,请纠正我!
这是我的问题:
- 我在上面的例子中是否正确,以这种方式发送的数据包(并且公钥是真正公开的)是安全的(当然任何东西都可以解密)但是,你知道,它是“安全的”吗?
- 每个用户都应该有自己的一对密钥吗?
- 我应该什么时候生成一对新的密钥?每次登录?
- 我应该什么时候向用户发送公钥?当他点击“注册”或“登录”时(已经用数据填充了文本字段)?或者当他打开应用程序时?
如果有人可以稍微解释一下这些事情,我将不胜感激!:)
@Luke Park 的另外两个问题
公钥是公开的,你说它不应该通过网络发送。这是否意味着使用公钥用户可以以某种方式解密数据?
第二个:您说我应该将公钥与应用程序捆绑在一起。如果公钥在黑客手中也是一种危险的工具,那么将其存储在代码中是否明智?据我所知,有一些方法可以从编译的程序中检索数据。
还有一个额外的!如果密钥是捆绑的(可能是硬编码的) - 它应该始终保持不变还是我应该改变这对(生成新的)?正如我在某处读到的,通过拥有一个“公开”的公钥,可以破解数据(这需要一些时间,但这是可能的)。