如何在javascript中使用MD5传输密码

25

我有一个jQuery对话框模态框,用于登录我的网站。当用户点击登录时,它会像下面这样向login.php文件发送post请求:

$.post(
      'includes/login.php', 
      { user: username, pass: password },
      onLogin, 
      'json' );

在将密码放入POST请求之前,我该如何对其进行MD5处理?另外,我已经使用MD5()将用户密码存储在MySQL数据库中,因此我想将提交的密码的MD5与存储的密码版本进行比较。感谢任何回复的人。


15
建议使用SSL来保护您的连接。 - Gumbo
同Gumbo所说的一样。然后在服务器端使用SHA256。 - AntonioCS
2
我已经启用了SSL,但我想在加密的HTTP头中加密密码。 - adhanlon
5
@Silmaril89,MD5不是加密算法,不建议用于存储密码。 - km1
4
使用SSL来保证连接安全是更好的选择,但在发送密码之前进行哈希处理是完全没有用的,正如jt在他的答案中所解释的那样。这个问题受到赞同是不好的,因为它会误导人们认为这是安全的。 - Pablo
因此,请编辑问题,假设该方案正在使用SSL。让问题更好。 - malthe
6个回答

31

Crypto-js 是一个丰富的 JavaScript 库,包含许多密码学算法。

你所需要做的就是调用 CryptoJS.MD5(password)

$.post(
  'includes/login.php', 
  { user: username, pass: CryptoJS.MD5(password) },
  onLogin, 
  'json' );

12
由于某种原因,此插件已不再可用。这里有一个版本:http://www.richardpeacock.com/dev/files/jquery.md5.js.txt - Rob
5
你可能应该使用更为常用的 http://code.google.com/p/crypto-js/ crypto-js,并包含所需加密的 JS 文件。 - Mech
2
我认为这个答案需要一些关注和细心,因为链接的插件现在似乎无法使用了。 - Kev
这不再托管在那个CDN上了。我花了一个小时想弄清楚发生了什么,最终意识到了这一点。最后从这里获取了zip文件,然后使用rollups中的sha1.js(它们是自给自足的)。 - Siddhartha

28

如果有人在嗅探你的明文HTTP流量(或缓存/cookie)以获取密码,仅将密码转换为哈希值是没有用的 - 哈希密码可以像明文一样被“重放”。 客户端需要使用类似日期和时间这样的随机数据来对密码进行哈希处理。

请参见此处关于“AUTH CRAM-MD5”的部分:http://www.fehcom.de/qmail/smtpauth.html


如果使用SSL并且问题没有说明不安全,那么它是安全的。 - malthe
基本身份验证在使用SSL时是安全的。 - Motomotes
@Motes,可以说问题的重点是永远不要看到明文密码,因此在客户端使用(可能经过加盐的)MD5。如果使用SSL,则仅从嗅探流量是不可能进行重放攻击的。 - malthe
1
每个授权的服务器nonce和客户端nonce都是唯一的,就像摘要认证一样,可以很好地防止嗅探攻击。 - Motomotes
@malthe,当然,使用SSL基本身份验证不会以明文形式传输密码,它们由SSL证书加密,但如果你的意思是服务器不应将密码存储为明文,那可能是正确的,但那么唯一真正的安全增强可以来自某个地方拥有私钥。服务器应使用一个从未存储过的服务器启动密码来加密密码,因为使用带有持久盐或随机数的MD5仍然会使服务器容易受到冲突攻击。对于真正的安全,某些东西需要被信任为敌人所不知道。 - Motomotes

16

我建议你在这种情况下使用CryptoJS。

CryptoJS基本上是一个使用最佳实践和模式,在JavaScript中实现标准和安全的加密算法的不断增长的集合。它们速度快,并且具有一致而简单的接口。

因此,如果您想计算密码字符串的哈希值(MD5),请按以下步骤操作:

<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/md5.js"></script>
<script>
    var passhash = CryptoJS.MD5(password).toString();

    $.post(
      'includes/login.php', 
      { user: username, pass: passhash },
      onLogin, 
      'json' );
</script>

所以这个脚本将把您的密码字符串的哈希值发送到服务器。

有关其他哈希计算算法的进一步信息和支持,请访问:

http://code.google.com/p/crypto-js/


谢谢您的回答...对于那些正在寻找JavaScript和c#/VB.NET之间的加密/解密,我们建议使用该答案并且您可能还想查看此链接http://msdn.microsoft.com/en-us/library/system.security.cryptography.md5(v=vs.110).aspx 适用于c#。 - Mina Gabriel

4

您可能想查看此页面:http://pajhome.org.uk/crypt/md5/

然而,如果保护密码很重要,您应该使用类似SHA256的东西(据我所知,MD5不是加密安全的)。更重要的是,您可能需要考虑使用TLS并获取证书,以便可以使用https。


谢谢回复,我正在使用https来搭建我的网站,但是由于某些原因,Apache在传输页面时使用了加密,但是页面加载后仍然使用https,但是页面没有加密。您认为当提交登录信息时,它是否仍会加密? - adhanlon
我不是专家,但你可以尝试使用数据包嗅探测试机器,以查看它是否加密。 - SapphireSun

2

回复jt。你是正确的,仅使用密码的HTML容易受到中间人攻击。但是,您可以从服务器生成一个GUID并将其用作种子...

$.post(
  'includes/login.php', 
  { user: username, pass: $.md5(password + GUID) },
   onLogin, 
  'json' );

这将打败中间人攻击...因为服务器会为每次尝试生成一个新的GUID。

2
是的,这是一个好主意。这种挑战/响应方法也在http://pajhome.org.uk/crypt/md5/auth.html中有所涵盖。 - Menace

0
如果你正在使用PHP jQuery,这可能会有所帮助:
   $.ajax({
        url:'phpmd5file.php',
        data:{'mypassword',mypassword},
        dataType:"json",
        method:"POST",
        success:function(mymd5password){
            alert(mymd5password);
        }
    });

在你的phpmd5.php文件中: echo json_encode($_POST["mypassword"]);
不需要js插件。只需使用ajax,让php md5()来完成工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接