На стороне сервера я создаю хэш пароля:
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, зашифрованное с помощью хэша, расшифровывает его на сервере и получает хэш для следующих манипуляций.
Ну, вот он: реализация CryptoJS криптографии PHP для MD5-хэшей (я думаю, что она слишком большая, чтобы вставить). Таким образом, это не полная криптоподобная вещь, но в вашем примере кода вы настраиваете хэш на основе MD5 (с префиксом $1$
salt).
Как это использовать:
php-crypt-md5.js
Используйте его так («rollups» находится в вашем каталоге 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);
Какой смысл шифровать на клиенте, а затем расшифровывать на сервере? Это не безопасность, если вся информация для шифрования является клиентской, все, что нужно сделать, это посмотреть на источник JS, чтобы узнать, какая у вас соль, там нет безопасности.
Все дело в том, чтобы отправить некоторые данные (по защищенному каналу, например https) на сервер, а затем получить хеш-сервер и сравнить этот хэш с тем, что вы уже сохранили.
Безопасность происходит от того, что происходит на сервере, а не от того, что вы делаете с данными перед отправкой. Безопасное соединение предотвратит прослушивание «человек в середине», но все, что у вас есть у клиента, находится в открытом доступе и никоим образом не способствует безопасности, если вы не используете информацию не в браузере (например, когда кто-то вставляет свой открытый ключ PGP вместе с тем, что вы отправляете, а сервер уже знает закрытый ключ PGP этого человека для проверки подлинности), и в этом случае фактические данные становятся неуместными, поскольку открытый ключ теперь является важной частью …
Так что да, не делай этого. Это заставляет вас поверить, что вы в безопасности, когда на самом деле вы только ухудшили ситуацию.