关于javascript:双向密码加密,无需ssl

关于javascript:双向密码加密,无需ssl

Two-way password encryption without ssl

我正在使用basic-auth twitter API(不再可用)将twitter与我博客的评论系统集成。这样做以及其他许多Web API的问题在于,它们需要用户的用户名和密码才能执行任何有用的操作。我不想处理安装SSL证书的麻烦和费用,但是我也不想以明文形式通过网络传递密码。

我想我的一般问题是:如何通过不安全的通道发送敏感数据?

这是我当前的解决方案,我想知道其中是否有孔:

  • 在服务器上生成一个随机密钥(我正在使用php)。
  • 将密钥保存在会话中,并在javascript变量中输出密钥。
  • 在提交表单时,使用Javascript中的Triple DES和密钥来加密密码。
  • 在服务器上,使用会话中的密钥解密密码,然后销毁会话。
  • 最终结果是仅加密的密码通过网络发送,并且密钥仅使用一次,并且从未与密码一起发送。问题解决了吗?


  • Generate a random key on the server (I'm using php).
  • Save the key in a session and also output the key in a javascript variable.
  • On form submit, use Triple DES in javascript with the key to encrypt the password.
  • 这避免了通过网络以明文形式发送密码,但是它要求您通过网络以明文形式发送密钥,这样任何窃听者都可以对密码进行解密。

    之前已经有人说过,我再说一遍:不要试图组成自己的加密协议!已经建立了针对此类事物的已建立协议,这些协议已由专业人员创建,同行评审,殴打,黑客入侵,戳戳和劝诱,请使用它们!没有一个人能够比整个密码和安全社区共同努力提出更好的建议。


    您的方法有一个缺陷-如果有人要拦截对用户的密钥传输以及用户的加密回复,则他们可以解密该回复并获取用户的用户名/密码。

    但是,有一种方法可以在不安全的介质上安全地发送信息,只要该信息不能在传输过程中被修改(称为Diffie-Hellman算法)即可。基本上,两方都可以根据他们的对话来计算用于加密数据的共享密钥-但是观察者没有足够的信息来推断密钥。

    设置客户端和服务器之间的对话可能很棘手,并且比仅将SSL应用于您的站点要花费更多的时间。您甚至不必为此付费-您可以生成提供必要加密的自签名证书。这不能防止中间人攻击,但是Diffie-Hellman算法也不能。


    您不必在服务器上拥有证书;客户端是否愿意与未经身份验证的服务器对话取决于客户端。仍然可以执行密钥协商以建立专用信道。但是,将私有凭据发送到未经身份验证的服务器并不安全,这就是为什么您在实践中看不到SSL以这种方式使用的原因。

    要回答您的一般问题:您只需发送它。我认为您真正的普遍问题是:"如何通过不安全的通道发送敏感数据,并确保其安全?"你不能。

    这听起来像是您认为安全性不值得每个证书每月花费10到20美元,并且保护Twitter密码确实是正确的。那么,为什么要花时间提供安全感呢?只需向您的用户明确表示他们的密码将以明文形式发送,让他们自己选择。


    API和OAuth

    首先,正如其他人所说,您不应使用用户密码来访问API,而应获得OAuth令牌。这样,您就可以代表该用户采取行动,而无需他们的密码。这是许多API使用的常见方法。

    密钥交换

    如果您需要解决在不安全的连接上交换信息的更一般的问题,则有其他答案提到的几种密钥交换协议。

    通常,密钥交换算法可以防止窃听,但是由于它们无法验证用户的身份,因此容易受到中间人攻击。

    来自Diffie Hellman上的Wikipedia页面:

    In the original description, the
    Diffiea€"Hellman exchange by itself does not provide authentication of
    the communicating parties and is thus vulnerable to a
    man-in-the-middle attack. A person in the middle may establish two
    distinct Diffiea€"Hellman key exchanges, one with Alice and the other
    with Bob, effectively masquerading as Alice to Bob, and vice versa,
    allowing the attacker to decrypt (and read or store) then re-encrypt
    the messages passed between them. A method to authenticate the
    communicating parties to each other is generally needed to prevent
    this type of attack. Variants of Diffie-Hellman, such as STS, may be
    used instead to avoid these types of attacks.

    在某些情况下,即使攻击者能够插入自己的身份(签名密钥)代替发送者或接收者,STS也不安全。

    身份和验证

    这正是SSL旨在解决的问题,方法是建立"受信任的"签名机构的层次结构,该层次结构在理论上已验证谁拥有域名等,连接到网站的人可以验证其确实与之通信该域的服务器,而不是中间位置放置中间服务器的服务器。

    您可以创建一个自签名证书,该证书将提供必要的配置以加密连接,但出于与未经身份验证的Diffie-Hellman密钥交换不会相同的原因,不会保护您免受中间攻击。

    您可以从https://www.startssl.com/获得1年有效的免费SSL证书-我将其用于我的个人网站。不管这意味着什么,他们都没有那么"受信任",因为他们只对申请者进行自动检查,但它是免费的。也有一些服务的成本非常低(从英国的123-Reg每年大约10英镑)。


    在客户端和服务器之间发送密钥时,该密钥为明文,可能会被截取。将其与密码的加密文本结合在一起,然后密码将被解密。

    Diffie-Hellman是一个很好的解决方案。如果只需要对它们进行身份验证,而实际上不传输密码(因为该密码已存储在服务器上),则可以使用HTTP摘要式身份验证或其中的一些变体。


    那么这怎么安全呢?即使您可能已经保护了浏览器<>您的服务器的安全,那其余的Internet(服务器<>推特)又如何呢?

    恕我直言,要求其他服务的用户名和密码并要求人们输入是不可接受的。而且,如果您非常在意-请不要整合它们,直到他们明白自己的行为并重新启用OAuth。 (他们支持了一段时间,但几个月前将其禁用。)

    同时,为什么不提供OpenID?每个Google,Yahoo!,VOX等帐户都有一个。人们可能没有意识到这一点,但是他们已经拥有OpenID的机会确实非常高。检查此列表以了解我的意思。


    客户端javascript安全性的问题在于,攻击者可以在传输过程中将javascript修改为简单的{return input;},从而使您的安全性备受争议。解决方案:使用浏览器提供的(即未传输的)RSA。据我所知,尚不可用。


    我采用了另一种方法

  • 服务器:用户名和密码哈希存储在数据库中
  • 服务器:发送带有要求密码的表格的质询,将其存储在带有时间戳和客户端IP地址的会话中
  • 客户端:对密码进行哈希处理,使用concat挑战|用户名|密码哈希,再次对其进行哈希处理并将其发布到服务器
  • 服务器:验证时间戳,IP,进行相同的串联/哈希处理并进行比较
  • 这适用于密码传输。将其用于数据意味着将最终的哈希作为明文的加密密钥,并生成随密码文本传输到服务器的随机初始化向量。

    对此有何评论?


    我有一个类似的问题(想要在不支付ssl证书的情况下加密表格中的数据),所以我做了一些狩猎,发现了这个项目:http://www.jcryption.org/

    我还没有使用过它,但是它看起来很容易实现,我想在这里共享它,以防其他人正在寻找类似的东西并像我一样在此页面上找到自己。


    如果您不想使用SSL,为什么不尝试使用其他协议,例如kerberos?

    基本概述如下:
    http://www.kerberos.org/software/tutorial.html

    或者,如果您想更深入一点,请参阅
    http://www.hitmill.com/computers/kerberos.html


    到OLI

    例如,在您的请求中,我位于同一子网中且具有同一路由器,因此我在工作中得到的IP与我的同事的IP相同。我在浏览器中打开相同的URL,因此服务器使用相同的ip生成时间戳,然后使用tcp / ip dump从我的同事连接中嗅探哈希或非哈希密码。我可以嗅出他发送的所有内容。因此,我从他的形式中获得了所有哈希,并且您也拥有了时间戳(我)和相同的IP。所以我使用发布工具发送所有内容,嘿,我正在登录。


    自签名的ssl证书不花钱。对于免费的Twitter服务,对用户来说可能就好了。


    How can I send sensitive data over an
    insecure channel

    具有预共享的密钥。这是您在建议的解决方案中尝试的方法,但是您不能通过不安全的通道发送该密钥。有人提到了DH,它将帮助您协商密钥。但是SSL的另一部分功能是提供身份验证,以防止中间人攻击,以便客户端知道他们正在与打算与之通信的人协商密钥。

    Chris Upchurch的建议确实是99.99%的工程师唯一的好答案-不要这样做。让其他人使用它并使用他们的解决方案(例如编写SSL客户端/服务器的人)。

    我认为这里的理想解决方案是让Twitter支持OpenID,然后再使用它。


    推荐阅读

      程序执行linux命令?

      程序执行linux命令?,系统,工作,地址,环境,信息,管理,命令,文件,目录,程序,lin

      linux执行2个命令?

      linux执行2个命令?,工作,系统,基础,命令,基础知识,信息,管理,在线,概念,第一

      linux命令批量执行?

      linux命令批量执行?,系统,代码,工作,周期性,数据,定期,环境,命令,文件,脚本,l

      linux二进制执行命令?

      linux二进制执行命令?,系统,工作,情况,代码,信息,位置,地址,命令,文件,目录,L

      linux执行退出命令?

      linux执行退出命令?,档案,状态,工作,命令,信息,地址,电脑,系统,编辑,文件,lin

      linux中后台执行命令?

      linux中后台执行命令?,系统,状态,暂停,灵活,电脑,网络,服务,第一,名字,命令,l

      linux命令行更新密码?

      linux命令行更新密码?,密码,系统,名称,软件,信息,环境,命令,使用者,权限,用

      linux登录改密码命令?

      linux登录改密码命令?,密码,系统,名称,软件,状态,服务,信息,策略,环境,命令,

      linux执行线程命令?

      linux执行线程命令?,系统,工作,线程,软件,服务,管理,信息,环境,名称,命令,lin

      删除密码命令linux?

      删除密码命令linux?,密码,系统,管理,电脑,软件,百度,信息,名称,名字,命令,lin

      linux执行多条命令?

      linux执行多条命令?,数据,通信,管理,系统,命令,标准,信息,工具,代码,环境,Lin

      linux串口命令行密码?

      linux串口命令行密码?,密码,系统,状态,信息,标的,地址,用户名,终端,用户,命

      linux退出命令未执行?

      linux退出命令未执行?,服务,工具,代码,环境,数据,官网,命令,用户,脚本,字符

      linux动态执行命令?

      linux动态执行命令?,时间,信息,名字,工作,网上,业务,工具,对比,地址,下来,如

      linux命令执行次数?

      linux命令执行次数?,时间,系统,地址,命令,数据,管理,工具,信息,环境,历史,lin

      linux命令一起执行?

      linux命令一起执行?,系统,标准,设备,地方,软件,代码,网站,网络,周期性,命令,l

      查看执行的命令linux?

      查看执行的命令linux?,系统,地址,信息,工作,命令,灵活,网络,名称,情况,状态,

      linux导出执行命令?

      linux导出执行命令?,数据,系统,命令,下来,位置,时间,工具,服务,文件,指令,lin

      linux持续执行命令?

      linux持续执行命令?,连续,定期,密码,系统,状态,命令,任务,文件,程序,前台,lin

      linux隐藏执行的命令?

      linux隐藏执行的命令?,工作,电脑,系统,地址,标准,信息,管理,命令,目录,软件,