Как получить правильный SHA1 хэш BLOB с помощью CryptoJS?

CryptoJS v3.1.2, sha1.js накопительный пакет

В JS я хочу вычислить SHA1 большого двоичного объекта перед отправкой его на сервер. На сервере я хочу вычислить SHA1 полученного файла и сравнить его с SHA1, полученным от JS. Проблема в том, что хеш, сгенерированный CryptoJS.SHA1(), неверен (всегда 9844f81e1408f6ecb932137d33bed7cfdcf518a3)

Код JS:

function uploadFileslice (slice) { // slice is a blob
    var fileReader = new FileReader()
    fileReader.onload = function(event){
        var arrayBuffer = event.target.result
        var wordArray = CryptoJS.lib.WordArray.create(arrayBuffer)
        var sha1crc = CryptoJS.SHA1(wordArray).toString(CryptoJS.enc.Hex)
        //etc
        requestParams.append('fileslice', slice)
        requestParams.append('sha1crc', sha1crc)
        //etc
    }
    fileReader.readAsArrayBuffer(slice)
}

Код PHP:

$file_crc = sha1_file($_FILES['fileslice']['tmp_name']);
if ($_REQUEST['sha1crc'] !== $file_crc) {
    echo "Invalid CRC: {$_REQUEST['sha1crc']} (expected $file_crc)";
    return;
}

Выход:

Неверный CRC: 9844f81e1408f6ecb932137d33bed7cfdcf518a3 (ожидается 3ebe2cd2d8fd8d8f977b6d715f0b1adf5b08b407

Я надеялся на что-то вроде myHash = CryptoJS.SHA1(blob)...

2 ответа

Решение

Исходя из предоставленной вами информации, я не уверен, как именно вы настроили вещи, но для поддержки ArrayBuffers вы должны включить компонент /lib-typedarrays-min.js.

Об этом можно узнать на https://code.google.com/p/crypto-js/issues/detail?id=67.

Надеюсь это поможет!

Если вы используете модули и importВы можете:

      import Hex from 'crypto-js/enc-hex'
import WordArray from 'crypto-js/lib-typedarrays'
import sha1 from 'crypto-js/sha1'

const hash = sha1(WordArray.create(arrayBuffer)).toString(Hex)
Другие вопросы по тегам