Как сгенерировать случайный пароль? - PullRequest
0 голосов
/ 22 мая 2018

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

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

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

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

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

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

Безопасно ли использовать это решение в разных браузерах?

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

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

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

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

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

Подводя итог:

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

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

0 голосов
/ 22 мая 2018

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

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.

...