Search code examples
phpjavascripthashcryptojs

PHP function crypt() in JavaScript


On the server side I create a password hash:

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());
}

And on client side I want to do the same using CryptoJS. Is there any analogues in javascript for PHP crypt(), not necessary with CryptoJS?

UPD: I want to do this on client side because I don't want to send password to server, but something like clientId crypted with hash, decrypt it on the server and get the hash for the next manipulations.


Solution

  • Well, here it is: a CryptoJS implementation of PHP's crypt for MD5-hashes (I guess it's too large to paste). So it's not a complete crypt-like thing but in your code example you are setting up a MD5-based hash (with the $1$ salt prefix).

    How to use it:

    1. Store in a file named php-crypt-md5.js
    2. Use it like that ("rollups" is in your CryptoJS directory, just use the correct path):

      <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);