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

Posted

技术标签:

【中文标题】如何在javascript中使用MD5传输密码【英文标题】:How to use MD5 in javascript to transmit a password 【发布时间】:2010-12-30 01:22:13 【问题描述】:

我弹出一个 jquery 对话框模式框,用于登录我的网站。当用户点击登录时,它会向 login.php 文件发出 post 请求,如下所示:

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

在将密码放入发布请求之前,我如何对该密码执行 md5 操作?另外,我使用 MD5() 将用户的密码存储在 mysql 数据库中,所以我想将存储的密码版本与提交的密码的 MD5 进行比较。感谢所有回复的人。

【问题讨论】:

更好地使用 SSL 来保护您的连接。 同意秋葵。然后在服务器端使用 SHA256 我确实启用了 SSL,但我希望在加密的 http 标头中加密密码。 @Silmaril89,MD5 不加密,不建议用于存储密码。 不仅最好使用 SSL 来保护连接,在发送之前对密码进行哈希处理完全没用,as explained by jt in his answer。这个问题被赞成是不好的,因为它误导人们认为这实际上是安全的。 【参考方案1】:

crypto-js 是一个丰富的 javascript 库,包含许多加密算法。

您只需拨打CryptoJS.MD5(password)

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

【讨论】:

此插件由于某种原因不再可用。这里有一个版本:richardpeacock.com/dev/files/jquery.md5.js.txt 你应该使用更标准的code.google.com/p/crypto-jscrypto-js 并包含你需要的加密的JS。 鉴于链接的插件现在似乎不可用,我认为这个答案需要一些关爱和关注。 这不再托管在该 CDN 上。在意识到这一点之前,我花了一个小时想知道发生了什么。最终从here 获取 zip,然后使用汇总中的 sha1.js(自给自足)【参考方案2】:

如果有人在嗅探您的纯文本 HTTP 流量(或缓存/cookie)以获取密码,那么将密码转换为哈希将无济于事 - 哈希密码可以像纯文本一样“重播”。客户端需要用一些随机的东西(比如日期和时间)对密码进行哈希处理 请参阅此处的“AUTH CRAM-MD5”部分: http://www.fehcom.de/qmail/smtpauth.html

【讨论】:

如果使用 SSL 是安全的,问题并没有说它不是。 @malthe 基本身份验证使用 SSL 是安全的 @Motes,可以说问题的关键是永远看不到纯文本密码,因此在客户端使用(可能是加盐的)md5。如果使用 SSL,那么仅通过嗅探流量就不可能进行重放攻击。 @malthe 每个授权唯一的服务器随机数和客户端随机数同样可以阻止嗅探,例如摘要身份验证。 @malthe,当然使用 SSL 基本身份验证不会以纯文本形式传输密码,它们由 SSL 证书加密,但如果您的意思是服务器不应该将密码存储为纯文本这可能是真的,但是唯一真正的安全性提高可能来自在某处拥有私钥。服务器应该使用从不存储的服务器启动密码来加密密码,因为使用带有持久盐或随机数的 MD5 存储它们仍然会使服务器容易受到冲突攻击。为了真正的安全,某些地方需要被信任以不为敌人所知。【参考方案3】:

我建议你在这种情况下使用 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 之间的加密/解密的人推荐的是这个答案,您可能还想看看这个msdn.microsoft.com/en-us/library/…对于 c#【参考方案4】:

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

但是,如果保护密码很重要,那么您确实应该使用 SHA256 之类的东西(MD5 不是加密安全的 iirc)。更重要的是,您可能需要考虑使用 TLS 并获取证书,以便可以使用 https。

【讨论】:

感谢您的回复,我的网站使用的是https,但是由于某种原因apache在传输页面时使用了加密,但是页面加载后仍然使用https,但是页面没有加密.你认为它在提交时仍然会加密登录信息吗? 我不是专家,但您可以尝试在测试机器上嗅探数据包,看看它是否已加密。【参考方案5】:

响应 jt.你是对的,只有密码的 HTML 很容易受到中间人攻击。但是,您可以使用来自服务器的 GUID 为其播种...

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

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

【讨论】:

是的,这是个好主意。 pajhome.org.uk/crypt/md5/auth.html 也介绍了这种挑战/响应方法【参考方案6】:

如果您使用的是 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"]);

不需要 jsplugins。只需使用 ajax 并让 php md5() 完成这项工作。

【讨论】:

以上是关于如何在javascript中使用MD5传输密码的主要内容,如果未能解决你的问题,请参考以下文章

将md5格式的现有密码传输到apache .htpasswd

登录系统中密码用MD5加密有何作用?防谁呢?

登录验证之密码处理

APP账号密码传输安全分析

APP账号密码传输安全分析

如何安全的保存密码?