Подтвердить что ты не робот

Существуют ли какие-либо модификации javascript SHA-256, которые обычно считаются заслуживающими доверия?

Я пишу логин для форума и должен хэш-клиент клиентской стороны в javascript перед отправкой его на сервер. У меня возникли проблемы с выяснением того, какую реализацию SHA-256 я действительно могу доверять. Я ожидал, что там будет какой-то авторитетный script, который все использовали, но я нахожу множество разных проектов со своими реализациями.

Я понимаю, что с помощью других людей криптография всегда является скачком веры, если вы не имеете права сами ее пересматривать и что нет универсального определения "заслуживающий доверия", но это кажется чем-то общим и достаточно важным, чтобы быть каким-то консенсусом относительно того, что использовать. Я просто наивна?

Изменить, так как в комментариях много: Да, мы делаем более строгий хэш снова на стороне сервера. Хеширование на стороне клиента не является конечным результатом, который мы сохраняем в базе данных. Хеширование на стороне клиента происходит потому, что клиент запрашивает его. Они не дали конкретной причины, почему, вероятно, они просто как перебор.

4b9b3361

Ответ 1

Stanford JS Crypto Library содержит реализацию SHA-256. Хотя криптография в JS на самом деле не очень хорошо проверена в качестве других платформ реализации, эта, по крайней мере, частично разработана и, в определенной степени, спонсируется Dan Boneh, который является хорошо зарекомендовавшим себя и заслуживающим доверия именем в криптографии, и означает, что у проекта есть некоторый контроль над тем, кто действительно знает, что он делает. Проект также поддерживается NSF.

Однако стоит отметить, что... ... что если вы хэш-клиент на стороне клиента перед его отправкой, хеш - это пароль, и исходный пароль становится неактуальным. Злоумышленнику нужно только перехватить хеш, чтобы олицетворять пользователя, и если этот хеш хранится без изменений на сервере, , то сервер сохраняет истинный пароль (хеш) в текстовом тексте.

Итак, ваша безопасность теперь хуже, потому что вы решили добавить свои собственные улучшения в ранее существовавшую схему.

Ответ 2

Forge Реализация SHA-256 является быстрой и надежной.

Чтобы запустить тесты для нескольких реализаций JavaScript SHA-256, перейдите в http://brillout.github.io/test-javascript-hash-implementations/.

Результаты на моей машине показывают, что кузница является самой быстрой реализацией, а также значительно быстрее, чем в Crypto Library (sjcl) в Стэнфорде, упомянутом в принятом ответе.

Forge имеет размер 256 КБ, но извлечение связанного с SHA-256 кода уменьшает размер до 4,5 КБ, см. https://github.com/brillout/forge-sha256

Ответ 3

Нет, нет возможности использовать браузер JavaScript для улучшения безопасности паролей. Я настоятельно рекомендую вам прочитать эту статью. В вашем случае самая большая проблема - проблема куриного яйца:

Что такое "проблема куриного яйца" с доставкой криптографии Javascript?

Если вы не доверяете сети для доставки пароля или, что еще хуже, не доверяете серверу не хранить секреты пользователя, вы не можете доверять им, чтобы предоставить код безопасности. Тот же самый злоумышленник, который нюхал пароли или читал дневники, прежде чем вводить криптографию, просто захватит криптовый код после того, как вы это сделаете.

[...]

Почему я не могу использовать TLS/SSL для доставки криптового кода Javascript?

Вы можете. Это сложнее, чем кажется, но вы безопасно передаете криптовалю Javascript в браузер с использованием SSL. Проблема в том, что, установив безопасный канал с SSL, вам больше не нужна криптография Javascript; у вас есть "настоящая" криптография.

Это приводит к следующему:

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

Нет надежного способа для любого фрагмента кода Javascript для проверки его среды выполнения. Криптокод Javascript не может спросить: "Я действительно имею дело с генератором случайных чисел или с какой-то факсимильной связью, предоставляемой злоумышленником?" И это, безусловно, не может утверждать: "никто не может ничего делать с этим секретным ключом, кроме тех способов, которые я, автор, одобряю". Это два свойства, которые часто предоставляются в других средах, которые используйте криптографию, и они невозможны в Javascript.

В основном проблема заключается в следующем:

  • Ваши клиенты не доверяют вашим серверам, поэтому они хотят добавить дополнительный код безопасности.
  • Этот код безопасности доставляется серверами (те, которым они не доверяют).

Или, альтернативно,

  • Ваши клиенты не доверяют SSL, поэтому они хотят, чтобы вы использовали дополнительный код безопасности.
  • Этот код безопасности поставляется через SSL.

Примечание. Кроме того, SHA-256 не подходит для этого, так как легко перетаскивать несанкционированные неиспользуемые пароли. Если вы решите сделать это в любом случае, найдите реализацию bcrypt, scrypt или PBKDF2.

Ответ 4

На https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest я нашел этот фрагмент, который использует внутренний модуль js:

async function sha256(message) {
    // encode as UTF-8
    const msgBuffer = new TextEncoder('utf-8').encode(message);                    

    // hash the message
    const hashBuffer = await crypto.subtle.digest('SHA-256', msgBuffer);

    // convert ArrayBuffer to Array
    const hashArray = Array.from(new Uint8Array(hashBuffer));

    // convert bytes to hex string                  
    const hashHex = hashArray.map(b => ('00' + b.toString(16)).slice(-2)).join('');
    return hashHex;
}

Обратите внимание, что crypto.subtle доступен только на https или localhost - например, для вашей локальной разработки с python3 -m http.server вам нужно добавить эту строку в ваш /etc/hosts: 0.0.0.0 localhost

Перезагрузитесь - и вы можете открыть localhost:8000 с работающим crypto.subtle.

Ответ 5

Я нашел эту реализацию очень простой в использовании. Также имеет щедрую лицензию в стиле BSD:

jsSHA: https://github.com/Caligatio/jsSHA

Мне понадобился быстрый способ получить шестнадцатеричное представление хеша SHA-256. Это заняло всего 3 строки:

var sha256 = new jsSHA('SHA-256', 'TEXT');
sha256.update(some_string_variable_to_hash);
var hash = sha256.getHash("HEX");

Ответ 6

Для тех, кого это интересует, это код для создания хэша SHA-256 с использованием sjcl:

import sjcl from 'sjcl'

const myString = 'Hello'
const myBitArray = sjcl.hash.sha256.hash(myString)
const myHash = sjcl.codec.hex.fromBits(myBitArray)

Ответ 7

Помимо Стэнфорда lib, о котором говорил тиллер. Я нашел jsrsasign очень полезным (Github repo здесь: https://github.com/kjur/jsrsasign). Я не знаю, насколько это заслуживает доверия, но я использовал его API SHA256, Base64, RSA, x509 и т.д., И он работает очень хорошо. Фактически, он также включает в себя стэнфордскую библиотеку.

Если все, что вы хотите сделать, это SHA256, jsrsasign может быть излишним. Но если у вас есть другие потребности в соответствующей области, я считаю, что это хорошо.