Устройства ядра
Существует несколько блочных и символьных устройств в Linux, которые также помогут вам в вопросах безопасности.
Два устройства, /dev/random и /dev/urandom, предоставляются ядром для получения в любой момент времени случайных чисел.
И /dev/random и /dev/urandom должны быть достаточно безопасны, чтобы использоваться в генераторах PGP ключей, SSH вызовах, и других приложениях, в которых используются случайные числа. Взломщик не должен иметь возможности предугадать следующее число, выданное любой начальной последовательностью чисел из этих генераторов. Было приложено огромное количество усилий для обеспечения того, чтобы числа, которые вы получаете от этих генераторов, были случайны в полном смысле слова "случайный".
Разница состоит только в том, что /dev/random оканчивается на случайном байте и это заставляет вас больше ждать до полного накопления. Заметьте, что в некоторых системах, это может на длительное время заблокировать ввод при генерации в системе записи о новом пользователе. Поэтому вы должны с осторожностью использовать /dev/random. (Возможно наилучшим будет использовать его, когда вы генерируете чувствительную к регистру (клавиши) информацию, и вы говорите пользователю постоянно стучать по клавишам, пока вы не выдадите "ОК, достаточно")
/dev/random является высококачественной энтропией, генерируемой из измерения времени внутренних прерываний, или чего-то в этом роде. Он блокируется до тех пор, пока не наберется достаточно бит случайных данных.
Работа /dev/urandom подобна, но когда памяти под энтропию становиться мало, он возвращает криптографически надежные случайные данные (hash) того что есть на момент останова. Это не настолько же безопасно, но достаточно для большинства приложений.
Вы можете читать с этих устройств используя что-то наподобие:
root# head -c 6 /dev/urandom | uuencode -
Эта команда выдаст 6 случайных символов на консоль, - удобно для генерации пароля.
Если вы хотите узнать алгоритм, то загляните в /usr/src/linux/drivers/char/random.c.
Спасибо Theodore Y. Ts'o, Jon Lewis, и другим ядерщикам Linux за помощь мне (Dave) в этом вопросе.