2

在服务器端,我创建了一个密码哈希:

public static function salt()
{
    return '$1$' . StringUtil::random(6, array('encode' => StringUtil::ENCODE_BASE_64));
}

public static function hash($password, $salt = null)
{
    return crypt($password, $salt ?: static::salt());
}

在客户端,我想使用 CryptoJS 做同样的事情。javascript中是否有PHP crypt()的类似物,CryptoJS不需要?

UPD: 我想在客户端执行此操作,因为我不想将密码发送到服务器,而是使用哈希加密的 clientId 之类的东西,在服务器上对其进行解密并获取哈希以进行下一次操作。

4

2 回答 2

2

好吧,这里是:用于 MD5 哈希的 PHP crypt 的 CryptoJS 实现(我猜它太大而无法粘贴)。所以这不是一个完整的类似 crypt 的东西,但在您的代码示例中,您正在设置一个基于 MD5 的哈希(带有$1$salt 前缀)。

如何使用它:

  1. 存储在一个名为php-crypt-md5.js
  2. 像这样使用它(“汇总”在您的 CryptoJS 目录中,只需使用正确的路径):

    <script src="rollups/md5.js"></script>
    <script src="php-crypt-md5.js"></script>
    
    <script>
        function createSalt(len) {
            var saltAlpha = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ" +
                "abcdefghijklmnopqrstuvwxyz./-+_"
    
            var salt = '$1$';
            for(var i = 0; i < len; ++i) {
                salt += saltAlpha.charAt(
                    Math.floor(Math.random() * saltAlpha.length));
            }
    
            return salt;
        }
    
        // in your JavaScript code:
    
        var salt = createSalt(8);
        var pw = "your password";
    
        var hash = CryptoJS.PHP_CRYPT_MD5(pw, salt);
    
于 2013-06-08T18:31:58.603 回答
1

在客户端加密然后在服务器解密有什么意义?这不是安全性,如果所有用于加密的信息都是客户端,那么有人需要做的就是查看 JS 源代码,看看你的 salt 是什么,那里没有安全性。

重点是将一些数据(通过安全通道,如 https)发送到服务器,然后让服务器对其进行哈希处理,并将该哈希值与您已经存储的内容进行比较。

安全性来自服务器上发生的事情,而不是您在发送数据之前对数据所做的事情。安全连接将阻止中间人侦听,但是您在客户端拥有的任何内容都是公开的,并且绝不有助于安全性,除非您使用的是浏览器之外的信息(例如让某人粘贴他们的 PGP 公钥以及您发送的任何内容,服务器已经知道此人的 PGP 私钥以进行身份​​验证)在这种情况下,实际数据变得无关紧要,因为公钥现在是重要的部分......

所以,是的,不要这样做。它让您相信自己更加安全,而实际上您只会让事情变得更糟。

于 2013-06-08T14:54:26.513 回答