JavaScript在sha512中加密,并在原始二进制数据中获得结果,如PHP hash()

JavaScript encrypt in sha512 and obtain result in raw binary data like PHP hash()

本文关键字:结果 PHP hash 二进制 加密 sha512 原始 数据 JavaScript      更新时间:2023-09-26

正如我在标题中所说,我需要重现这个PHP函数(在JavaScript中):

hash("sha512", "string", true);

棘手的部分如果是真的在最后意味着:

当设置为TRUE时,输出原始二进制数据。FALSE输出小写hexits。

如果我需要自己创建一些东西,如果我应该处理endian:,这也很重要

tiger算法现在使用大端字节排序。

参考:php.net-hash()

EDIT:经过一些测试和研究,这里是我需要在JavaScript:中复制的函数

hex2bin("string");

实际上,女巫CryptoJS我可以在hexa中获得结果。我不知道如何在行二进制数据(等同于hex2bin)中获得它。

我发现有了NodeJS和库加密,我们可以很容易地做到这一点,但我不使用NodeJS。我需要在经典JavaScript(或jQuery或任何其他可用的lib)中获得相同的结果。

我的目标是向Symfony的WSSE协议发送一个与数据库(passwordDigest)中的密码匹配的密码。

以下是我需要复制的PHP代码:

public function encodePassword($raw, $salt)
    {
        // ... Some check code for data
        $salted = $this->mergePasswordAndSalt($raw, $salt); // Just do $raw."{".$salt."}";
        $digest = hash($this->algorithm, $salted, true);
        // "stretch" hash
        for ($i = 1; $i < $this->iterations; $i++) {
            $digest = hash($this->algorithm, $digest.$salted, true);
        }
        return $this->encodeHashAsBase64 ? base64_encode($digest) :
bin2hex($digest);
    }

这是我实际拥有的JavaScript代码:

WSSE.encodePassword = function(password, salt) {
    try {
        var salted = WSSE.mergePasswordAndSalt(password, salt);
        var digest = CryptoJS.SHA512(salted).toString();
        for (i = 1; i < 5000; i++) {
            digest = CryptoJS.SHA512(digest + salted).toString();
        }
        return WSSE.base64_encode(digest);
    } catch(err) {
        Log.e("WSSE", err.message);
        return null;
    }
};

此代码的问题在于,摘要变量始终包含hexa中的数据,而不是原始二进制数据中的数据。

一个想法,代码,还是解放所有人?

我找到了一个基于EmberJS的WSSE实现的解决方案:https://github.com/Gerfaut/ember-simple-wsse-auth

正好在https://github.com/Gerfaut/ember-simple-wsse-auth/blob/master/packages/ember-simple-wsse-auth/lib/core.js

Ember.SimpleWsseAuth.EncodePassword = function(password, salt) {
    var salted = password + '{' + salt + '}';
    var passwordEncoded = CryptoJS.SHA512(salted);
    for(var i = 1; i < this.passwordEncodingIterations; i++) { //TODO use webworker
        passwordEncoded = CryptoJS.SHA512(passwordEncoded.concat(CryptoJS.enc.Utf8.parse(salted)));
    }
    return this.passwordEncodingAsBase64 ? passwordEncoded.toString(CryptoJS.enc.Base64) : passwordEncoded;
};

您的编码器密码功能变为

WSSE.encodePassword = function(password, salt) {
    try {
        var salted = WSSE.mergePasswordAndSalt(password, salt);
        var digest = CryptoJS.SHA512(salted);
        for (i = 1; i < 5000; i++) {
            digest = CryptoJS.SHA512(digest.concat(CryptoJS.enc.Utf8.parse(salted)));
        }    
        return WSSE.base64_encode(digest);
    } catch(err) {
        Log.e("WSSE", err.message);
        return null;
    }
};

使用http://movable-type.co.uk/scripts/sha512.html您可以获得与使用功能相同的输出

hash('sha512', 'puma');

这是Chris Veness 的优秀解决方案