JavaScript中的PHP函数crypt()

时间:2013-06-08 04:26:32

标签: php javascript hash cryptojs

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

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做同样的事情。 在PHP crypt()的javascript中是否有任何类似物,CryptoJS不是必需的?

UPD: 我想在客户端执行此操作,因为我不想向服务器发送密码,但是像clientId这样的东西用哈希加密,在服务器上解密并获取下一次操作的哈希值。

2 个答案:

答案 0 :(得分:2)

嗯,这是:a CryptoJS implementation of PHP's crypt for MD5-hashes(我猜它太大了,无法粘贴)。因此,它不是一个完整的类似于crypt的东西,但在您的代码示例中,您正在设置基于MD5的哈希(使用$1$ salt前缀)。

如何使用它:

  1. 存储在名为php-crypt-md5.js
  2. 的文件中
  3. 像这样使用它(“汇总”在你的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);
    

答案 1 :(得分:1)

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

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

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

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