2011-09-20 212 views
8

是否可以通过Web浏览器创建需要公钥/私钥的登录进程?公钥将被存储在服务器上,并且私钥将被用户保存(和加密)。基于Web的登录使用SSL公钥/私钥?

我基本上想做类似于SSH的事情,但通过网络。也许是HTTP身份验证的一种自定义方法(“摘要”除外)。

我知道使用股票浏览器可能无法做到这一点,因此可以接受使用此工作的扩展程序(Chrome/Firefox)。

理想情况下,密钥将在USB棒上加密。当USB拔出时不得不无法登录(不希望浏览器缓存它)。

这将在内部使用。

编辑:客户端证书将是我正在寻找的,但是如何将这些证书存储在USB记忆棒上?另外,有没有关于如何使用PHP认证用户的信息?

+0

这是可能的,但有时挑剔。 Google提供“SSL客户端证书”。 –

+0

我将如何使证书便携/可移动(存储在USB棒上)? – Luke

+0

通常,证书将安装到特定的浏览器配置文件中。脱机证书功能必须由浏览器支持。或者,您可以使用Firefox的“便携式”安装,或者将整个浏览器及其所有配置文件信息(包括客户端证书)存储在USB存储棒中的东西。 –

回答

4

这是通过证书的客户端身份验证。
您的服务器应配置为需要客户端证书,并且配置为使用信任库。
所有浏览器都支持此功能。
您只需将具有私钥和证书的客户机密钥库导入机器证书集。
对于Windows,它是在互联网上的选项

+1

如何在OS X上的Chrome中进行设置?我希望证书位于可移动USB存储棒上。我怎么做到这一点? – Luke

+0

Chrome/Mac将OS X钥匙串用于客户端SSL证书。我不认为有可能将它们保留在外部驱动器上(尽管我可能是错的)。 – Quentin

2

我怀疑你可以用Web应用程序来做到这一点。浏览器在操作系统中被沙盒化,您将无法让Web应用程序检测到USB驱动器的存在,也无法使用Web应用程序读取任何数据。所以你需要浏览器为你做这件事,而且他们不是这样设计的。

当您将客户端证书加载到浏览器时,它将被加载到证书存储中。这些根据浏览器和操作系统而不同。在OSX上他们进入KeyChain。在Windows上,一些将进入OS密钥存储,一些将进入浏览器自己的密钥存储(Firefox我相信这样工作)。但是它们都不允许你定义一个外部密钥库,然后加密和解密你试图保护的密钥,因为它从该驱动器读取和写入。

如果你为自己编写了自己的桌面应用程序(本质上是你自己的浏览器),你所做的只会是可能的。

您可以使用Adobe AIR应用程序完成此操作。 Adobe AIR支持从USB驱动器读取和写入数据,它支持加密数据库(使用SQLite的128位AES/CBC加密),您可以在其中存储要保护的数据,并且它是跨平台的。

使用这些解决方案中的任何一种,您都可能在需要确保USB密钥插入时停止使用。这可能很难做到。您如何阻止用户将文件从USB密钥复制到硬盘,然后使用该密钥,以便他们不需要使用USB密钥?

要达到这种控制水平,您可能需要查看真正的本地解决方案。 C++,Objective-C或Java。 Java将成为唯一一个为您提供跨平台解决方案的平台。

如果USB密钥对最终用户而言是一种方便,而不是要求,那么Adobe AIR将是一个可靠的解决方案。如果不是的话,那么现在是时候刷新你的桌面软件开发技能。

+0

即使在OS X上,Firefox也使用它自己的密钥存储。Firefox中有“安全设备”,允许您使用智能卡,这是一种在外部存储私钥的方式。 Firefox将此称为PKCS#11。我不清楚如何设置它。 PKCS#12应该是一个便携式解决方案。但我不确定Firefox是否支持这一点。这就是我迄今为止所发现的,但我无法弄清楚如何设置这一点。我不确定Firefox是否支持PKCS#12。防止用户复制密钥不是问题,因为它是非常短的用户列表。只是不希望浏览器这样做。 – Luke

+0

确实,谢谢你指出。智能卡是可以与许多应用程序配合使用的解决方案。我从海报中得到了这样的印象,那不是他想要走的路线,但将它作为一个选项提出来是有道理的。如果OP愿意抛弃现金来购买智能卡解决方案,那么这可能是一条可行的路。 –

0

客户证书是答案。大多数/所有浏览器都将这些客户端证书导入为PKCS#12(.p12,.pfk)。

您可以使用公钥(.crt),私钥(.key)和CA证书(.crt)将现有的x509证书转换为PKCS#12文件。您可以使用下面的命令与OpenSSL的做到这一点:

openssl pkcs12 -export -out client.p12 -inkey client.key -in client.crt -certfile ca.crt 

如果自签名证书,它以确保证书的序列比其他证书的不同是很重要的。如果它们相同,则可能会尝试导入.p12文件时遇到错误(因此请注意openssl示例中的-set_serial)。

不幸的是,证书移动/可移动唯一的跨平台方式是使用智能卡(使用PKCS#11)。

在Mac OS X上,Safari和Chrome从钥匙串中访问其证书。您实际上可以在USB闪存驱动器上创建自定义钥匙串(文件 - >新钥匙串)。创建钥匙串后,您只需将.p12文件拖入您的钥匙串即可。有关这方面的好处是,您可以控制对访问证书的应用程序的访问权限,并且您可以在发生一定的不活动状态后锁定钥匙串本身。

用Safari浏览器可以很好地工作。如果拔下闪存驱动器,它会在几秒钟后停止发送该证书。如果你重新插入它,它会马上拿起它。如果您使用“钥匙串访问”锁定证书,它将要求输入密码。它可以防止您在使用过程中正确弹出闪存驱动器,但一分钟后Safari释放它的锁定。

铬是finicky。它将证书缓存几分钟。如果锁定钥匙串,它将继续使用缓存版本。如果您尝试正确卸载闪存驱动器,它会告诉您Chrome正在使用它,直到您关闭它。如果您在Chrome运行时插入闪存驱动器,则无法启动。

因此,看来Safari是唯一支持此功能的浏览器。 Firefox和Opera都有自己的密钥存储区。

如果你想隐藏你的闪存驱动器上的自定义钥匙串,你可以创建一个不可见的文件夹前加一段时间(如“./.keys”)。创建钥匙串时,您可以通过按Command + Shift +“。”查看对话窗口中的不可见文件夹。

1

您的问题的答案是“今天不可能”。

该技术今天已经以所有浏览器已经支持的证书形式出现。但要获得您想要的内容,浏览器必须允许在其用户界面的“密码管理器”部分添加和管理证书。人们希望在设备之间同步它们。

此外,网站需要进行类似的更改,以便用户能够管理存储在网站上的公钥,而不是管理其密码。

这种系统的好处是你永远不必将密码(私钥)发送到你登录的网站。但除此之外,您仍然拥有您今天使用密码进行的所有管理活动。

2

这是我如何使用PHP的RSA公钥/私钥做基于网络的登录:

  • 在注册,服务器存储用户的公钥和给用户一个ID
  • 在登录时,用户会被要求输入他的ID和私钥

注册非常简单。

  • 服务器生成一个包含一些数据的字符串:随机字符串,当前时间,用户的IP
  • 该字符串与AES有两个密码加密两次:

    但登录是这样做的话nonce1 = pass2(pass1(string))

  • 相同的字符串与AES加密,再有两个密码,但以相反的顺序:nonce2encrypted = encryptPubKeyRSA(userPubKey, nonce2)
nonce2 = pass1(pass2(string)),并将结果与​​用户的公钥进行加密

P.S.该字符串使用两个密码加密,难以进行暴力攻击。

登录表单包含三个隐藏的输入:nonce1,nonce2encryptednonce2没有值。

然后用户被要求在一个textarea是外<form>标签(以确保它不会被发送到服务器上的表单提交),一个JavaScript将解密nonce2encrypted并设置解密进入他的私人密钥值为nonce2。然后,带有私钥的textarea被从javascript中删除,只是为了确保它不会被存储在浏览器的某个地方或发送到服务器。

服务器收到nonce1nonce2,并用这两个密码解密它们。如果解密值相同,则用户接收cookie并登录。

P.S.该cookie还包含一些加密数据,例如用户ip。这不允许有人窃取这个cookie从另一个ip登录。

您可以view this method in actionproject on github