我正在编写一个Java项目,它将包含3-6个不同客户端的所有内容。这个项目是开源的,我想知道你可以/应该使用什么安全机制。问题是:因为它是开源的,我相信任何有用户的人都有可能编写自己的客户端(可能不现实,但确实可能),并与服务器/数据库进行联系。我尝试过将不同的数据作为不同的角色读写到数据库的所有场景,最后我总结说,我必须在更高的级别上有一些安全机制(检查帐户类型是否允许持久化该实体的ID等等是不够的)。在某种程度上,我必须知道客户联系是我写的正确的客户端。对Jar文件进行签名可以解决整个问题,还是有其他方法可以解决呢?
-Yngve
发布于 2009-03-03 16:10:01
我真的认为,如果限制服务器端的可用活动(基于角色)是不够的,那么问题就更大了。即使用户不编写自己的客户端,用于远程调用的任何机制也可能容易被拦截和操纵。底线是,您应该限制可能针对服务器进行的调用,并应将每次对服务器的调用视为潜在的恶意调用。
您能想到一个示例场景吗?在这个场景中,有一个特定的经过身份验证的用户可以采取的服务器操作,如果他们使用的是您的客户端,那么这个操作会很好,但是如果他们不使用您的客户端,就会很危险了?如果是这样的话我会说你太依赖你的客户了。
然而,我不只是批评你,我也想对你的问题提供一些实际的答案。我认为,如果您想象的是恶意用户,那么对jar文件进行签名是不够的;一般来说,公钥加密可能对您没有多大帮助,因为假想的恶意用户正在反向工程您的源将访问您的公钥,因此可以伪造您构建的任何身份验证。
最终,系统中必须有你信任的人,所以你必须弄清楚谁是谁,并把你的安全建立在他们周围。例如,让我们想象一下,在某一特定公司中,可能有许多用户您不一定信任他们,而有一位管理员负责监督他们,并信任他们。在这种情况下,您可以设置客户端,以便管理员必须在启动时输入特殊代码,并将该代码保存在内存中并与任何请求一起传递。这样,即使用户逆向工程您的代码,他们将不会有管理代码。当然,客户端对服务器的调用仍然很容易被拦截和操纵(更不用说,这一要求对用户来说将是一种巨大的痛苦)。
底线:如果您的用户的机器正在调用您的服务器,则您的用户正在调用您的服务器。不要相信你的用户。限制他们能做什么,不管他们在使用什么客户端。
发布于 2009-03-03 09:07:18
好的,源代码可能对任何人都是可用的,但是部署和数据库的配置肯定不是,当您部署应用程序时,可以添加具有角色的用户。最简单的方法就是将它们保存在数据库中。当然,只有数据库管理员才能访问表的内容。数据库管理员将配置应用程序,使其能够访问所需的表。当用户尝试登录时,他/她必须提供用户名和密码。应用程序将读取表以验证/授权用户。
这种类型的安全性是最常见的。要真正安全,您必须通过安全路径(HTTPS)传递凭据。为了获得更高程度的安全性,可以使用HTTPS客户端身份验证。为此,您可以为每个客户端生成一个公钥,并使用服务器的私钥对其进行签名。然后,客户端需要将这个签名的密钥与每个请求一起发送。
编辑:用户能够编写自己的客户端并不会降低应用程序的安全性。如果需要先登录,他/她仍然无法访问该应用程序。如果登录成功,那么将创建一个会话(cookie),它将与每个请求一起传递。看看弹簧安全。它确实有一个相当陡峭的学习曲线,但如果您只做一次,那么您可以在几分钟内在任何应用程序中添加安全性。
https://stackoverflow.com/questions/605589
复制相似问题