如何在Ruby中正确签名数据(HMAC?)

时间:2009-12-04 19:25:14

标签: ruby signing

我有一个服务器(RoR应用程序)向客户端(Ruby Sinatra应用程序)发送信息,我需要一种方法让客户端确定数据来自我的服务器,而不是邪恶的第三方。

客户端必须先登录服务器才能以其他方式发回任何内容,以便服务器可以使用用于签署所有进一步响应的共享密钥来回复登录,但第三方可以捕获该响应并成为恶

我想找到一些方法(在Ruby中,考虑到跨平台的适用性)来签署服务器的响应,以便可以在不检查导致伪造的客户端代码的情况下验证它。有什么想法吗?

更新:让我们看看能否更好地解释一下!

(自从我写这个问题以来,我已经向github添加了代码,所以你可以(如果你愿意的话)蠢蠢欲动:The 'client' The 'server'

过程是这样的:Joe Bloggs在他的移动设备上使用了一个书签。这会将当前访问的URL发布到sitesender.heroku.com。当sitesender.heroku.com收到该请求时,它会检查其数据库以查看是否有人使用Target application登录了同一帐户。如果有,他们的IP地址将被记录,并且sitesender.heroku.com将向该IP发出目标应用程序(网络服务器)的GET请求,要求目标在默认浏览器中隐藏已添加书签的URL。

基本的想法是,当您发现iPhone无法应对页面时(例如闪光灯,屏幕尺寸),您可以从iPhone将站点发送到主计算机以供日后查看。

显然,主要的问题是,对于开放式服务器,任何人都可以发送请求向各种IP开放'seriousevilwebsite.com',并且我已经在数字世界中引发了瘟疫。看到我正在使用heroku.com作为服务器(它是一个非常好但基于云的RoR主机)我不能只测试原始IP。

据我了解HTTPS,对于此设置,我必须为每个 target应用程序整理证书吗?我同意我需要某种形式的非对称加密,使用私钥(从未分发)签署来自sitesender.heroku.com的传出请求,并使用公共密钥执行相同的操作target并测试相似性 - 但你猜对了,我对HMAC如何工作仍然有点无能为力!它是如何不对称的?是否制定了使用私钥和公钥执行相同的HMAC操作将生成相同的签名?在这种情况下 - HMAC是赢家!

感谢您的耐心等待!

1 个答案:

答案 0 :(得分:1)

我不确定你的意思是“自由审查,但没有复制”。

一般情况下,如果您需要安全的通信渠道,https就是您的朋友。

如果失败(或者由于某些架构问题导致它不够),HMAC和非对称加密是可行的方法。

更新:我不确定我是否理解这个问题,所以我会尝试描述我认为您要解决的问题:您的客户需要对回复充满信心他们看到的实际上来自你的服务器。

假设我是正确的,这确实是你要解决的问题,HTTPS很好地解决了这个问题。您在服务器上安装了证书 - 您可以自己签名,但默认情况下客户端不会信任它;为此,您需要从一个标准证书颁发机构(CA)购买一个 - 然后客户端向您的服务器发出HTTPS请求。 HTTPS处理验证是否为其正在与之通信的服务器颁发了提供的证书。你已经完成了。

最后,我认为对HMAC如何运作存在误解。非对称加密的关键原则是从不分发您的私钥。使用非对称加密,您可以使用收件人的公钥加密邮件,并使用他/她的私钥对邮件进行解密。您使用私钥对邮件进行签名,然后他/她使用您的公钥对其进行验证。