我有系统设计和编程经验,但没有网络安全经验。有人能帮我确定以下设计是否合理安全吗?
该系统由两部分组成:
首先是一个网站/服务器(使用 SSL 保护),它显示地图并绘制用户位置的轨迹。朋友和亲戚在用户提供密码后可以登录并查看用户的位置和去过的地方(例如过去 24 小时)。
其次,手机应用程序将 GPS 数据发送到服务器。后者的主要设计考虑是使位置信息尽可能简短,以尽量缩短电池寿命和用户的数据限额。因此,我不太想使用 SSL 从手机发送消息(这会给原本很小的消息(可能每分钟发送一次)增加很大的开销)。它还增加了应用程序的复杂性和大小。
我提出的解决方案如下:
当注册(通过网站)时,系统会根据用户名和密码为用户创建一个哈希,该哈希将作为“用户 ID”存储在数据库中(这与仅用于存储密码的哈希不同)。可能是 SHA512,尽管它可能不必要地长。
在手机上安装应用程序时,用户会输入用户名和密码。然后,应用程序使用相同的哈希算法,并通过非 SSL 端点将哈希值发送到服务器。如果识别成功,服务器会响应 OK,应用程序会将哈希值存储为用户 ID。
应用程序运行时,每次记录新位置时,都会将新位置连同时间戳和用户 ID 一起发送到服务器(同样非 SSL)。服务器根据正确的用户 ID 相应地存储数据。
该服务器将运行两个独立的 Web 服务,一个是 SLL,一个不是,都与同一个数据库通信。
这里可能存在某个缺陷,如果存在,请告诉我!当然,出于安全考虑,没有密码的人不应该能够看到用户的下落。提前致谢。
答案1
正如@Eugen 指出的那样,从这两个角度来看都存在缺陷:
- 我们可以识别哈希并观察用户
- 我们可以使用哈希来模拟用户
此外,有效载荷是“很清楚“,这可能根本不适合用户的位置数据......
您可以考虑使用时间戳对散列数据进行加盐,这至少会为每个报告创建一个新的散列,但这会增加服务器验证散列的工作量(您需要尝试每个用户,可能使用一系列时间戳)。
签名是解决这个问题的好方法 - 最好看看JSON Web 令牌虽然这实际上是为了验证会话数据等的真实性......但有效载荷仍然是清楚的。
SSL 确实在建立连接时增加了开销,但您真的量化了吗?您确定这是个问题吗?此外,就应用程序的复杂性增加而言,并没有太大影响。由于您每分钟报告一次位置,您能否考虑在报告之间保持 SSL 会话处于活动状态,从而消除建立连接的开销?
请记住,SSL 不是加密有效负载的唯一方法。您可以使用其他非对称加密(例如不是使用对称加密)... 使用非对称加密,任何人都可以为特定目标加密数据(使用公钥),但只有目标可以解密数据(使用私钥)。 请查看 GPG 以获得流行的起点 - 这也会增加一些开销,但以明文形式传输此类数据实际上是不可接受的。
答案2
您的设计确实存在隐私漏洞:一旦攻击者找出了用户的哈希值,他就可以冒充该用户,即将错误的位置数据发送到服务器。
这是因为,你的哈希是静态的——一旦知道,就永远知道。
有一种方法可以解决这个问题:在客户端上连接有效负载数据和当前时间戳,然后使用哈希对其进行签名。将时间戳(明文)与请求一起发送,并让服务器拒绝明显错误的时间戳。
- 哈希值从未发送,因此无法被窥探
- 可以通过检查签名来验证时间戳的有效性
- 如果攻击者窃听消息,他就无法冒充该设备。
当然,仍然存在的隐私风险是,GPS 数据对所有监听者开放——这对你来说可能会或可能不会接受。