使用ssl公钥/私钥进行基于Web的登录?

时间:2011-09-20 20:47:07

标签: php ssl security ssl-certificate

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

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

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

理想情况下,键会在USB记忆棒上加密。拔掉USB记忆棒时必须无法登录(不希望浏览器对其进行缓存)。

这将在内部使用。

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

5 个答案:

答案 0 :(得分:4)

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

答案 1 :(得分:2)

我怀疑你能用Web应用程序做到这一点。浏览器是从操作系统沙箱化的,您将无法让Web应用程序检测到USB驱动器的存在,也无法通过Web应用程序读取任何数据。因此,您需要浏览器为您执行此操作,并且它们不能以这种方式工作。

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

只有您编写了自己的桌面应用程序(基本上是您自己的浏览器),才能实现此目的。

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

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

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

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

答案 2 :(得分:2)

以下是我在php中使用RSA公钥/私钥进行基于Web的登录的方法:

  • 在注册时,服务器保存用户的公钥并为用户提供ID
  • 登录时,系统会要求用户输入其ID和私钥

注册非常简单。

但是以这种方式登录:

  • 服务器生成一个包含一些数据的字符串:随机字符串,当前时间,用户&#c;
  • 使用带有两个密码的AES对该字符串进行了两次加密:nonce1 = pass2( pass1( string ) )
  • 使用带有两个密码的AES再次加密相同的字符串,但顺序相反:nonce2 = pass1( pass2( string ) )并使用用户的公钥加密结果:nonce2encrypted = encryptPubKeyRSA( userPubKey, nonce2 )

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

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

然后要求用户在<form>标签之外的textarea中输入他的私钥(以确保它不会在表单提交时发送到服务器), javascript将解密nonce2encrypted并将解密值设置为nonce2。然后使用javascript从html中删除带有私钥的textarea,以确保它不会存储在浏览器中的某个位置或发送到服务器。

服务器接收nonce1nonce2,并使用这两个密码对其进行解密。如果解密的值相同,则用户会收到cookie并登录。

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

您可以view this method in actionproject on github

答案 3 :(得分:1)

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

现在,这种技术已经以证书的形式存在,并且已经在所有浏览器中得到支持。但是为了得到你想要的东西,浏览器必须允许在用户界面的“密码管理器”部分添加和管理证书。人们希望在设备之间同步它们。

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

此类系统的好处是您实际上不必将密码(私钥)发送到您登录的网站。但除此之外,您仍然可以使用密码进行所有管理活动。

答案 4 :(得分: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闪存驱动器上创建自定义钥匙串(文件 - &gt;新钥匙串)。创建钥匙串后,您只需将.p12文件拖到钥匙串中即可。这样做的好处是你可以控制访问哪些应用程序有权访问证书,并且你可以在一定量的不活动后锁定钥匙串本身。

使用Safari可以很好地工作。如果拔下闪存驱动器,它会在几秒钟后停止发送该证书。如果你把它重新插入,它会马上把它拿起来。如果您使用“Keychain Access”锁定证书,则会要求输入密码。它会阻止您在使用中正确弹出闪存驱动器,但一分钟后Safari会释放其锁定。

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

所以似乎Safari是唯一支持此功能的浏览器。 Firefox和Opera都有自己的密钥库。

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