SecureRandom в JavaScript?

Если Вы оглядываетесь назад на свой старый код и говорите, "Что было мной взгляды! Это - мусор, я пишу код намного лучше теперь!" тогда Вы разработали как программист.

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

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

я очень согласился бы, что ASP.NET является намного более зрелой и эффективной средой программирования. Однако как любой инструмент, необходимо знать (или учиться), правильный способ использовать его, поскольку это не собирается автоматически превращать Вас в "супер программиста" в течение ночи.

А способ повредить лед состоит в том, чтобы согласиться с Вашим боссом, что следующий "сайт", который Вы создаете, разрабатывается в ASP.NET. Объясните ему, что потребуется довольно много дольше, чем, как Вы в настоящее время поставляете сайты, потому что необходимо "получить голову вокруг" ASP.NET, но преимущества являются x, y и (осуществление, оставленное читателю!)

Лично, я нахожусь все еще в этапе перехода (и я начал использовать ASP.NET от v1!), поскольку у меня есть довольно устойчивая Классическая платформа ASP, которой я разрабатываюсь и доволен. Однако я использовал ASP.NET стратегически и нашел, что это ОЧЕНЬ мощный и Ваш действительно заканчивает тем, что писало, должен меньше кодировать, поскольку так много встроено в .net платформу, пока можно найти его в документации.

я также рекомендую не использовать VB.NET и Ваш стиснуть зубы для использования C#. Изменение языка довольно незначительно, но Вы уменьшаете возможности записи Ваших сайтов точно, то же было, когда Вы привыкли для. Это помогает повредиться, дурные привычки annd дает Вам шанс изучить новые методы.

Удачи!

7
задан Peter O. 21 September 2014 в 07:45
поделиться

1 ответ

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

  • js
  • securerandom js

диапазона securerandom По сути, я думал, что будет хорошо обновить это сообщение с рабочим ответом, доступным сегодня (2019):

отрывок ниже работ Crypto.getRandomValues() для определения источника случайных значений, которые, как сказали, были,

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

Таким образом, мы имеем:

var N = 32;
var rng = window.crypto || window.msCrypto;
var rawBytes = Array
              .from(rng.getRandomValues(new Uint8Array(N)))
              .map(c => String.fromCharCode(c))
              .join([]);

Источник: основанный на JavaScript Генератор Пароля

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

function hexEncode(s) {
  return s.split('').map(c => (c < String.fromCharCode(16) ? '0' : '') + c.charCodeAt(0).toString(16)).join([]);
}

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

function secureRandomHash(N) {
  N = N || 32; // Coalesce if size parameter N is left undefined

  // TODO: Consider refactoring with lazy-loaded function
  // to set preferred RNG provider, else throw an error here
  // to generate noise that no secure RNG is available for
  // this application.
  var rng = window.crypto || window.msCrypto;

  return Array
           .from(rng.getRandomValues(new Uint8Array(N)))
           .map(c => (c < 16 ? '0' : '') + c.toString(16)).join([]);
}

Счастливое кодирование!

Редактирование: Оказывается, что я закончил тем, что нуждался в этом в своем собственном проекте, который также реализует предложенный TODO в предыдущем примере (ленивая загрузка), таким образом, здесь мы идем:

Math.secureRandom = function() {
  var rng = window.crypto || window.msCrypto;
  if (rng === undefined)
    throw 'No suitable RNG found';

  // Lazy-load this if- branch
  Math.secureRandom = function() {
    // More secure implementation of Math.random (https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#Examples)
    return rng.getRandomValues(new Uint32Array(1))[0] / 4294967296;
  };

  return Math.secureRandom();
}

Или если Вы чувствуете себя действительно предприимчивыми...

// Auto-upgrade Math.random with a more secure implementation only if crypto is available
(function() {
  var rng = window.crypto || window.msCrypto;
  if (rng === undefined)
    return;

  // Source: https://developer.mozilla.org/en-US/docs/Web/API/Crypto/getRandomValues#Examples
  Math.random = function() {
    return rng.getRandomValues(new Uint32Array(1))[0] / 4294967296;
  };
})();

console.log(Math.random());

, Расширить ли ли Math или перезаписать Math.random() для общедоступной замены, подходит для Вашего приложения, или целевую аудиторию оставляют просто как академическое осуществление конструктору. Обязательно согласуйте с Вашим архитектором сначала! Лицензируйте MIT здесь, конечно, :)

3
ответ дан 7 December 2019 в 09:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: