Как создать случайный пароль?

HelloWorld спросил: 28 апреля 2018 в 09:14 в: javascript

Мне нужно создать случайный пароль, который будет использоваться в OpenPGP.js для шифрования чего-то симметричного. Пользователю никогда не придется прикасаться или видеть пароль (все происходит за кулисами). Таким образом, в идеале пароль будет всего лишь количеством случайных байтов. К сожалению, OpenPGP.js не поддерживает это (насколько мне известно). Он поддерживает только строки как пароли.

Поэтому мне нужно создать случайную строку пароля. Я хочу, чтобы он был как можно более случайным; исключая как можно меньше символов.

Как я могу создать безопасную строку случайного пароля?

В настоящее время у меня есть это:

String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));

Тем не менее, я немного обеспокоен тем, что это может испортить суррогатные пары UTF-16, когда появляются определенные случайные байты, и что пароль может интерпретироваться по-разному в других браузерах в зависимости от их реализации в Unicode.

Это безопасное решение для использования в браузерах?

2 ответа

Marcel Klein ответил: 28 апреля 2018 в 10:08

Я бы легко использовал что-то вроде:

function generatePass() {
  var pass = "";
  var possible = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";

  var passLength = (Math.random() * 15) + 5;
  
  for (var i = 0; i < passLength; i++)
    pass += possible.charAt(Math.floor(Math.random() * possible.length));

  return pass;
}

console.log(generatePass());

Das anpassen und variieren des Codes ist auch sehr leicht und läuft überall.

HelloWorld ответил: 28 апреля 2018 в 07:20
Danke, aber nicht был ich suche :)
Есть решение
HelloWorld ответил: 28 апреля 2018 в 07:22

Чтобы ответить на мой собственный вопрос:

Часть моей системы шифрует и расшифровывает пароли (например, случайные в вопросе). При тестировании моего решения с помощью OpenPGP.js строка, возвращаемая с

Это говорит о том, что OpenPGP.js не выполняет сериализацию или десериализацию UTF-8 правильно (или какую бы кодировку он не использовал) когда его ввод неверен. Я предполагаю, что строки, которые я создаю, являются недопустимыми Unicode - по крайней мере, в Chrome.

Я работаю, когда я определяю ограниченный набор символов. Очевидно, что

:

String.fromCharCode.apply(null, crypto.getRandomValues(new Uint8Array(32)));

небезопасно использовать.