Как правильно рассчитать sha256 на Javascript? - PullRequest
0 голосов
/ 11 октября 2019

У меня проблема. Я хочу получить хэш sha256, используя изображение на javascript, но мой sha256 неверен.

Это мой код:

<button onclick="onSuccess()">Click me</button>
<script src="https://cdnjs.cloudflare.com/ajax/libs/crypto-js/3.1.9-1/crypto-js.js"></script>
<script>

    function onSuccess(imageURI) {
        var hash = CryptoJS.SHA256("imagehere");
        console.log([hash].join(''));
    }
</script>

Но результат: f3ccce7bbec0d8b3b4c6f967b2e405609b7fe69130930627b1eaBeaBeBeBeBeBeBeBeBeBeBeBeBeBeBeBeBeBeBeD: bedce3a32c3c2350dbcb220ed21aca171dfe57abdf68bf9ba878c0c447214742

Что я делаю не так? а где ошибка?

Ответы [ 2 ]

0 голосов
/ 14 октября 2019

вы просто получаете хэш текста C:\Users\fjolmedo..., вы не хэшируете содержимое файла с таким именем, потому что ваш код не открывает / не читает его содержимое. т.е. вам действительно нужно прочитать файл с диска в память, а затем выполнить хэш для этого.

из-за последствий для безопасности, позволяющих произвольным (ненадежным) веб-страницам читать те файлы, которые им нравятся, доступ толькопредоставляется, когда пользователь выбирает файл с помощью файла input или помещает в него файл

cryptojs, похоже, не поддерживает более поздние функции JavaScript, такие как ArrayBuffer, поэтому ваши вопросы требуют немного больше кода, чем вывозможно, см. https://stackoverflow.com/a/33918579/1358308 для примера

0 голосов
/ 11 октября 2019

Я не эксперт в этом вопросе, но я нашел комментарий к другой ветке, который дал мне понимание происходящего, поэтому я просто опубликую его здесь:

«То, что действительно происходит, это то, что SHA256 возвращает 256-битное хеш-значение. Итак, вы печатаете те байты, как если бы они были символами, и их соответствующие символьные значения - все это бред». То, что онлайн-инструмент возвращает вам, это:представление этого значения в шестнадцатеричном формате. Обратите внимание, что вы получаете (с помощью инструмента) 64 байта IE 64 символа, когда 256-битный равен 32 байта (вы можете подумать, 32 символа). Это потому, что для представления целогобайт в шестнадцатеричном формате требуется 2 символа. 4 старших значащих бита занимают один символ, а другие младшие биты берут другой. "

В принципе, как я понимаю, оба являются правильными, но анализируются по-разному.

Вы можете видеть здесь , что последний, который вы разместили, находится в шестнадцатеричном соde, но это не то, что на самом деле возвращает любой алгоритм хеширования sha256 в коде.

Попробуйте этот инструмент онлайн-конвертации, и вы увидите, что он выдает то же, что и ваш первый (этот методотдает вам).

Наконец, вы должны полагаться на формат, возвращаемый в коде (из вызова функции), поскольку он всегда будет корректным даже при использовании других библиотек с таким же алгоритмом хеширования.

Надеюсь, что этопомогает

...