我们目前有一个J2EE系统实现了大多数OWASP十大安全措施,此时应用程序允许用户使用存储在数据库中的用户/密码组合登录。
我有一个映射到/*
的java过滤器,用于检查会话和会话属性的存在,以确定用户的登录状态。
好的,最后问题是:我们正在与一家制造设备的公司合并,以便在发生特定事件时通过GPRS发送URL请求,此URL是指向我们系统的链接。
我会(不损害安全性)喜欢对此“设备”进行身份验证,因此无法向设备发送任何信息,因此需要对单个请求进行身份验证,否则任何人都无法“重播”该网址< / p>
如果没有某种相互认证,我不知道这是否可行。我想到要检查的IP地址的白名单,但网络不断更改IP,设备仍然“未识别”。请告知任何想法?
PS:我的临时解决方案是在我的过滤器中添加一个例外,但这不是长期的,而且完全不安全。 (SSL也不是一种选择)
答案 0 :(得分:4)
您可以让设备使用私钥对请求(包括唯一请求标识符)进行签名。然后,服务器可以检查签名是否有效,并且只接受/接听请求。
请求ID可用于确保不重播此类请求。对请求ID使用一个简单的计数器意味着很容易检查是否已经使用了给定的标识符(即,是否正在重放请求)。
答案 1 :(得分:1)
主要问题是,如果设备包含任何身份验证信息,则第三方可以使用该身份验证信息。
因此,主要问题是(a)您想要进行身份验证的确切内容(应该是设备本身还是设备所有者或设备的位置或......)以及(b)设备可以支持哪些功能 - 什么样的设备是什么以及它在运营方面可以做些什么。
如果设备可以嵌入旨在保存私钥并抵消提取尝试的智能卡或密码,那么数字签名将非常有用。
如果设备可以拥有受保护的内存但无法执行加密操作(并且无法嵌入智能卡),那么我可以考虑预先计算的一次性密码列表,每个设备都是唯一的。服务器将具有全局列表的副本,并在使用列表后从列表中删除密码。