我正在编写一个有两层的应用程序,坐在两个独立的服务器上:
表示层(用户上传/选择图像的位置)
应用层(处理图像的位置)
可能有多个不同的演示服务器与应用程序服务器通信。
确保只有这些演示服务器可以与应用程序服务器通信的最佳方法是什么。防火墙实际上不是一个选项,因为可以动态设置表示层。
是否有最佳做法在两个服务器之间创建密钥,因此当我从Presentation层对Application层执行GET / POST请求时,它知道它是来自该服务器的有效请求而不是外部世界?< / p>
我想我可以做一些像
那样粗暴的事情/request/?key=xyz123
并检查另一台服务器上的key == xyz123
,但这对我来说似乎不太安全。
如果两个服务器都有加密哈希,我可以做类似
的事情 encrypt(time());
在表示层上,然后decrypt(time());
在另一台服务器上,检查它是否在请求的20秒内或其他内容。
只是想知道这方面的最佳做法是什么?
谢谢!
答案 0 :(得分:2)
在您的服务器上设置HTTPS,并使用您为此特定目的创建的SSL证书相互进行身份验证。每个人都这样做是有原因的。
答案 1 :(得分:1)
通过SSL运行应用程序层,然后只使用密钥。您应该考虑将应用程序层锁定到IP范围,如果它在任何方面都是敏感的。
答案 2 :(得分:0)
加密(时间());在表示层然后解密(time());在另一台服务器上检查它是否在请求的20秒内或之前。
正如其他人所说,最好将连接保持在网络堆栈的下方。如果这是不可能的,那么考虑使用基于顺序事务id的哈希(以防止重放攻击)以及数据有效负载的某些部分(以防止请求伪造)。
仅使用请求时间就必须使用可逆加密而不仅仅是哈希,并且只减少攻击窗口 - 您没有解决MITM或请求伪造。
答案 3 :(得分:0)
(SSL让我很头疼:p所以这是一个我想的简单方法)
一种简单的方法是设置您选择的密码,例如:“myLongPasswordWitheWeirdChracters”然后根据此密码对其进行加密,并使用“发布”或“获取”数据(与其他内容)一起发送,然后在在其他服务器上,您要做的第一件事就是使用相同的长密码对其进行解密,因为只有您的两个服务器知道此密码,他们是唯一可以解密使用此密码或密钥加密的邮件的人。
好吧,让我给你真实的东西,理论很无聊:p)
使用此课程来加速: http://www.phpclasses.org/browse/file/17234.html 像这样:
//创建一个很长的密钥
$myKey = "a big key with weird charcters àçèàçè'(";
//将它交给班级
$crypter = new(2, $myKey);
//现在使用$ crypter可以加密evrything
$cryptedData = $crypter->encrypt($aDataInDB);
$ aDataInDB是来自您存储在其数据库中的第一台服务器的每次上传的唯一变量(每次随机选择它,它更安全,并存储它)。
现在当数据到达第二台服务器时,使用相同的类解密它(有一种方法)并连接到第一台服务器数据库以检查它是否存在,如果存在,你可以确定这个查询是来自你的服务器,因为你是成功解密并将其与原始进行比较(然后将其删除以保持你的crtypted键“一次性使用”)。
希望有所帮助:)