Безопасные случайные числа в JavaScript?



Как создать криптографически безопасные случайные числа в javascript?

608   6  

6 ответов:

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

Edit: я сам немного поиграл с концепцией, сделав генератор паролей, я бы не гарантировал, что моя функция отбеливания безупречна, но будучи постоянно пересаживается я уверен, что это много для работы: ebusiness.hopto.org/generator.htm

Edit2: теперь он работает со смартфонами, но только путем отключения сенсорной функции во время сбора энтропии. Android не работать любым другим способом.

на WHATWG обсуждалось добавление этого в окно.объект крипто. Вы можете читать обсуждение и проверить предлагаемый API и ошибка webkit (22049).

только что проверил следующий код в Chrome чтобы получить случайный байт:

(function(){
  var buf = new Uint8Array(1);
  window.crypto.getRandomValues(buf);
  alert(buf[0]);
})();

для того, я думаю, что ваши лучшие ставки:

    использовать window.crypto.getRandomValues, например:

    var random_num = new Uint8Array(2048 / 8); // 2048 = number length in bits
    window.crypto.getRandomValues(random_num);
    

    Это поддерживается во всех современных браузерах и использует генератор случайных чисел операционной системы (например,/dev/urandom). Если вам нужна совместимость с IE11, вы должны использовать их префиксную реализацию черезvar crypto = window.crypto || window.msCrypto; crypto.getRandomValues(..) хотя.

    отметим, что window.crypto API также может генерировать ключи вчистую, который может быть лучшим вариантом.

    вы можете попробовать http://sourceforge.net/projects/clipperzlib/ Он имеет реализацию Фортуна который является криптографически безопасным генератором случайных чисел. (Взгляните на src/js/Clipperz/Crypto / PRNG.js). Похоже, что он также использует мышь в качестве источника случайности.

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

    Comments

      Ничего не найдено.