2015-08-12 2 views
5

Если вам нужно создать строку/токен для аутентификации будущих запросов (например, ключ API, URL-адрес подтверждения электронной почты и т. Д.), Какие факторы следует учитывать?Что делает шифр/токен криптографически безопасным?

В частности

  • Что делает строку "обеспечить"/"очень трудно угадать"?
  • Как измеряется/оценивается «сумма обеспечения»?
  • Каковы основные стандарты?

Практический пример

Давайте возьмем эти два выходных строки из NodeJS.

Строка 1 (через Node crypto)

var crypto = require('crypto'); 
crypto.randomBytes(48, function (ex, buf) { 
    console.log(buf.toString('hex')); 
}); 

Строка 2 (через Node UUID)

var uuid = require('node-uuid'); 
console.log(uuid.v4()); 

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

Кроме того, не стесняйтесь предлагать какие-либо хорошие вводные материалы по этой теме, так как я не мог легко найти статьи об этом в Интернете.

+0

Я почти не думаю, что есть разница в отношении ваших данных и целей использования. – marekful

+0

@marekful, спасибо! Где я пытаюсь попасть сюда, так это: как понять разницу? – Pensierinmusica

+1

Проверьте эту страницу на [крипто-силовой случайности] (http://www.cs.berkeley.edu/~daw/rnd/). –

ответ

5

Что делает строку «безопасной»/«очень трудно угадать»?

Строка или токен не могут быть криптографически безопасными, поскольку это static.

Понятие криптографически безопасного (псевдо) генератора случайных чисел (CS (P) RNG) описывает, что произведенные числа не предсказуемы. Это свойство процедуры, а не отдельных номеров.

Как измеряется/оценивается «сумма обеспечения»?

Это зависит от источников случайности, которые используются, потому что некоторые из них являются черным ящиком. Вы можете генерировать много случайности и посмотреть, есть ли там какие-то шаблоны. Есть some test suites available, но тогда вам нужно подумать о своем приложении и о том, как быстро вам нужны эти случайные числа. Возможно, что запрос большого количества случайности истощает пул и затем производит недостаточно случайные числа.

Каковы основные стандарты?

Используйте назначенные криптографический безопасной случайность источники/рамок в вашей системе. Node.js 'crypto.randomBytes() является одним из тех, кто хочет доверять документации.

Практический пример

узла UUID использует crypto.randomBytes()internally, так что, по существу, та же сила случайности позади него, но он будет Откат к Math.random(), если crypto.randomBytes() не доступен. Math.random() is not cryptographically secure. Если вы хотите иметь криптографически безопасные случайные значения в браузере, вам нужно будет запросить API веб-шифрования getRandomValues().

+0

К сожалению, node-uuid будет [тихо отстраняться от небезопасного PRNG] (https://github.com/broofa/node-uuid/blob/4ff82d52f9c9026fbacfb31eebb92c37efc460b2/uuid.js#L38-L52). –

+0

Да, он вернется к небезопасному PRNG, но только для браузера или действительно старых версий node.js. –

+0

Я бы лично предпочел ошибку, сказав: «Это нельзя безопасно использовать на небезопасной платформе, пожалуйста, обновите свое программное обеспечение». –