【问题标题】:should images be sent from server to client or stay on client [closed]图像应该从服务器发送到客户端还是留在客户端[关闭]
【发布时间】:2017-10-05 17:45:03
【问题描述】:

我正在用 Java 制作二十一点游戏, 而且我不确定是否应该每次都将卡片的图像从服务器发送到客户端,或者只是将所有图像文件放在客户端并使用它们的名称。

一方面,发送图像可能会使编程有点混乱,并使程序运行得更慢, 但另一方面,我不想让客户能够从他身边搞砸事情。 此代码不适用于生产,但对我来说强调安全性和稳定性很重要。

很高兴听到您的意见,谢谢:)

【问题讨论】:

  • 您是否希望计划并让客户提供他们自己的图像作为卡片?喜欢自定义主题?如果是,那么留在客户上是有道理的。您始终可以在首次运行/安装时复制/下载。
  • Stackoverflow 旨在帮助您解决现有代码中的编码问题,而不是讨论设计。也许softwareengineering.stackexchange.com 更适合这种问题。
  • 答案是肯定的和否定的。为什么?因为它取决于您想要实现的更多上下文。您想为用户提供一系列可能会随着时间而更新的包装设计吗?例如。这些设计决策将影响您如何管理这方面的事情。如果你从服务器下载图片,你应该考虑缓存它们,这样你就不需要每次都下载它们

标签: java swing security server client


【解决方案1】:

你在正确的轨道上。如果您发送图像,它会减慢您的应用程序并使代码更加复杂。如果您从本地存储库加载图像,用户可以将这些文件替换为他们自己的图像。

如果您关注安全性,您可以将文件放在本地并加密它们。用无需密钥即可正确解密的图像替换文件将很困难(阅读:不可能)。然而,攻击者可以换牌(即,仅通过更改文件名将 ace 替换为 10)。为了避免这种情况,不只是加密消息,而是加密元组(卡值,图像)。这样,您可以在解密后验证该值是否符合您的预期。鉴于没有人知道用于加密/解密的密钥,这一切都很好。因此,您需要隐藏密钥(通过网络发送、将其隐藏在内存中等)。此外,加密和解密确实需要时间,因此会降低您的应用程序的速度。这不会像您通过网络发送图像时那样明显,但它会在那里。

如果您沿着发送图像的路径走下去,仍然存在可能的攻击向量。攻击者可以拦截网络包并向您的客户端发送不同的图像。为避免这种情况,您将需要使用加密协议。许多常见的协议都有加密选项。

【讨论】:

  • 如果服务器不会使用客户端发送的任何信息,除了他的操作(双重,二十一点)?我的意思是,如果服务器正在管理卡片和值,而客户端只是获取图像名称并将其显示给玩家,然后客户端发送他的动作怎么办?在这种情况下,如果客户更改图片名称,图像只会在他身边改变,我错了吗?
  • @heapoverflow 是和否。他们理论上只能更改他们身边的图片,但如果这就是您所关心的,那么从本地或远程源加载图像并不重要。两者的结果只是改变了屏幕上的图像。想想在线赌场。您可以更改照片,这样看起来您应该赢了,但输了。然后要求退款。此外,图像库并不是非常安全,这意味着它们可以加载破坏 jpg 库并运行任意代码的图像。这就是病毒隐藏在某些在线广告中的方式。
  • 请注意,您不能“隐藏密钥”,因为它需要用于解密收到的任何内容。客户拥有密钥,可以用它做任何事情,例如。它可以加密一个新的甲板(如果它是对称密钥 - 如果不是,攻击者可以用他同时拥有私有和公共部分的密钥替换客户端上的密钥)。 TL;DR:这不能安全地完成。用户可以完全控制客户端以及提供给客户端的任何内容。
  • @Gabor 是的。它在用户空间中。他们可以附加一个调试器并做任何他们想做的事情。我们正试图使其尽可能安全,并表明我们已经考虑过攻击媒介。如果他们可以使用调试器,他们就可以更改执行指针并运行任意代码,因此担心他们从内存中获取它并不是我们真正应该关注的。
猜你喜欢
  • 1970-01-01
  • 2015-06-23
  • 2018-04-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多