2011-08-17 32 views
3

我正在寻找协议/算法,这将允许我在我的应用程序& HTML页面之间使用共享密钥的改进我的共享秘密算法/方法和建议加密协议

共享密钥旨在确保只有拥有此应用的用户才能访问该网页。

我的问题:我不知道是什么算法(我的方法来验证到HTML页面的有效访问)&我应该为此使用何种加密协议。

人们向我建议我使用HMAC SHAXXX或DES或AES,我不确定我应该使用哪一种 - 你有什么建议吗?

我的算法是,像这样:

  • 我创建一个共享的秘密,在App &的HTML页面知道(可以称之为 “MySecret”)。为了确保共享密钥始终是唯一的,我将在秘密结尾添加当前日期&分钟,然后使用XXX算法/协议(HMAC/AES/DES)对其进行哈希处理。因此,未加密的秘密将是“MySecret08/17/2011-11-11” &可以说的是,哈希是“XYZ”
  • 那么我该散列添加到URL CGI:http://mysite.com/comp.py?sharedSecret=xyz
  • 的comp.py脚本然后使用相同的共享密钥&日期组合,散列它,然后检查结果散列与CGI变量sharedSecret(“xyz”)相同。如果是,那么我知道一个有效的用户正在访问该网页。

你能想到更好的方法,以确保有效的人可以访问我的网页(网页允许用户进入一个竞争)?

我想我使用了正确的轨道上共享的秘密但我对验证方法的秘密似乎尤其是有缺陷的,如果散列算法不把所有的时间产生相同的结果为相同。

+0

“app”是指桌面软件? – shesek

+0

没有对不起,通过应用程序我的意思是Android应用程序 – Bouszeer11

+1

可能重复的[算法:停止无效条目到Python脚本比赛](http://stackoverflow.com/questions/7034870/algorithm-stop-invalid-entries-into- a-competition-in-python-script) – geoffspear

回答

3

尤其是如果散列算法不能在所有时间内产生相同的结果。

然后哈希被破坏。为什么不呢?

你想在简单情况下使用HMAC。您使用共享密钥“签署”您的请求,并且签名由服务器验证。请注意,HMAC应包含更多数据以防止重放攻击 - 实际上它应包含所有查询参数(按指定顺序)以及序列号以防止窃听者重播相同消息。如果您正在验证的是共享密钥,则任何人都可能会继续使用此共享密钥,直至其过期。通过包含一个序列号或一个短的有效范围,您可以配置服务器来标记。

请注意,这仍然不完善。 TLS支持客户端和服务器端证书支持 - 为什么不使用它?

+0

+1包括整个URL。这会让你非常接近OAuth。 – Thilo

+0

感谢您的回复:我不确定如何使用序列号,但是?应用程序和Python脚本都需要知道序列号是不是他们? – Bouszeer11

+0

@ Bouszeer11:它可以安全地作为请求的一部分发送。只要序列号是HMAC数据的一部分,它就可以被认证。 –

0

看起来像它会工作。时钟漂移可能是一个问题,如果在确切时间内出现故障,您可能需要验证+/- 3分钟的范围。

尤其是有缺陷的,如果哈希算法不会产生相同的结果对于相同的输入所有的时间

那么,这将是一个破碎的哈希算法即可。散列可靠性每次对同一输入产生相同的输出(并且对于不同的输入几乎总是不同的输出)。

+0

请注意(视情况而定),您可能需要包含更多信息,而不仅仅是查看秘密和时间戳以避免重播攻击(请参阅@ Yann的回复)。 – Thilo

0

尝试使用某种网络加密。您的Web服务器应该能够自动处理该类型的身份验证。剩下的就是让你把它写入你的应用程序(无论如何你都必须这样做)。根据您的应用平台,您也可以自动执行此操作。

Google这些:Kerberos,SPNEGO和HTTP 401需要授权。您可以使用简单的硬编码用户名和密码HTTP标头,并通过HTTPS运行连接。这样,您的服务器上的自定义代码就会减少,并且您的服务器将负责为您的身份验证请求进行身份验证。更不用说你正在利用HTTP的一些附加功能。