是否可以通过Web浏览器创建需要公钥/私钥的登录过程?公钥将存储在服务器上,私钥将由用户保存(和加密)。
我基本上想做类似于SSH的事情,但是通过网络。也许是HTTP身份验证的自定义方法(“摘要”除外)。
我知道使用股票浏览器可能无法做到这一点,因此可以接受扩展功能(Chrome / Firefox)。
理想情况下,键会在USB记忆棒上加密。拔掉USB记忆棒时必须无法登录(不希望浏览器对其进行缓存)。
这将在内部使用。
编辑:客户端证书将是我正在寻找的,但如何将这些证书存储在USB记忆棒上?此外,是否有关于如何使用PHP验证用户的信息?
答案 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的登录的方法:
注册非常简单。
但是以这种方式登录:
nonce1 = pass2( pass1( string ) )
nonce2 = pass1( pass2( string ) )
并使用用户的公钥加密结果:nonce2encrypted = encryptPubKeyRSA( userPubKey, nonce2 )
P.S。该字符串使用两个密码加密,更难以进行暴力攻击。
登录表单包含三个隐藏的输入:nonce1
,nonce2encrypted
和nonce2
没有值。
然后要求用户在<form>
标签之外的textarea中输入他的私钥(以确保它不会在表单提交时发送到服务器), javascript将解密nonce2encrypted
并将解密值设置为nonce2
。然后使用javascript从html中删除带有私钥的textarea,以确保它不会存储在浏览器中的某个位置或发送到服务器。
服务器接收nonce1
和nonce2
,并使用这两个密码对其进行解密。如果解密的值相同,则用户会收到cookie并登录。
P.S。该cookie还包含一些加密数据,例如用户ip。这不允许有人偷走这个cookie从另一个ip登录。
答案 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 +“。”来查看对话窗口中的不可见文件夹。