Это хорошая идея, чтобы генерировать случайные строки до успеха с "crypto / rand"? - PullRequest
0 голосов
/ 17 октября 2018

Является ли хорошей идеей генерировать безопасную случайную шестнадцатеричную строку до тех пор, пока процесс не завершится успешно?

Все примеры, с которыми я сталкивался, показывают, что если rand.Read возвращает ошибку, мы должны паниковать, os.Exit (1) или верните пустую строку и ошибку.

Мне нужно, чтобы моя программа продолжала функционировать в случае таких ошибок и подождать, пока не будет сгенерирована случайная строка.Это хорошая идея, чтобы зацикливаться, пока строка не будет сгенерирована, какие-либо подводные камни с этим?

import "crypto/rand"

func RandomHex() string {
    var buf [16]byte
    for {
        _, err := rand.Read(buf[:])
        if err == nil {
            break
        }
    }
    return hex.EncodeToString(buf[:])
}

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Нет.Он может всегда возвращать ошибку в определенных контекстах.

Пример: детская площадка: не использовать / dev / urandom в crypto / rand

Представьте, что машина неиметь источник, из которого crypto / rand получает данные, или программа работает в контексте, который не имеет доступа к этому источнику.В этом случае вы можете подумать о том, чтобы программа возвращала эту ошибку значимым образом, а не вращением.

Более конкретно, если вы серьезно относитесь к использованию crypto/rand, тогда попробуйте написать RandomHex так, чтобы оно быловызывающему абоненту исключительно ясно, что он предназначен для контекстов безопасности (возможно, переименуйте его) и возвращает ошибку из RandomHex.Вызывающая функция должна обработать эту ошибку и сообщить пользователю, что что-то не так.Например, в api rest я бы ожидал, что эта ошибка появится в обработчике запросов, завершится с ошибкой и вернет 500 в этой точке и зарегистрирует ошибку высокой серьезности.

0 голосов
/ 18 октября 2018

Это хорошая идея для цикла, пока не будет сгенерирована строка,

Это зависит.Вероятно, да.

какие-либо подводные камни с этим?

Вы отбрасываете случайные байты, прочитанные по ошибке.И это в тесной петле.Это может истощить ваш источник энтропии (в зависимости от ОС) быстрее, чем он может быть заполнен.

Вместо несвязанного бесконечного цикла: перерыв после n раундов и сдача.Лучшее постепенное ухудшение или остановка: если ваша программа застряла в бесконечном цикле, она также не «продолжает».

...