Tom, On Wed, Feb 25, 2015 at 2:39 PM, Tom Worster <f...@thefsb.org> wrote: > I welcome the proposal for an easy-to-use PHP function for obtaining > crypto-secure randomness. I have a number of comments and suggestions. > > I think the function name(s) should indicate that these functions are > for getting crypto-secure randomness. I proposed cs_random_bytes() > previously (https://wiki.php.net/rfc/csrandombytes) and I still it > works. First, it's important that users understand this distinction. > Second, given all the shared environments, it's good for the world at > large if people aren't draining the operating system's "entropy pool" > for work that doesn't need crypto-secure randomness, e.g. Monte Carlo > simulations that are better served with a different source. > > CS random strings are often required but I haven't ever seen > requirements for arbitrary alphabets, charsets and encodings. In Yii > we provided a method that returns a string using the 64-character set > [a-zA-Z0-9_-] which is nice because they are all transparent in URLs. > There are many uses for such strings and it seems to meet the needs of > most users, as they haven't requested more flexibility. > > I don't understand the requirement for crypto-secure random integers. > I have never encountered this requirement. [Btw: the proposed patch > implements this function using a loop that's not guaranteed to > terminate in any given amount of time.] > > I believe that simplicity is of *paramount importance*. I also believe > in only addressing the requirements of 90% of the users if addressing > the 10% specialists means complicating the API and adding potential > footguns. > > For example, the number of users that actually need to do something > better than read from /dev/urandom is small. A user that is concerned > about the status of the system's "entropy pool" (whatever that might > mean) or that feels the need to check the "degree of seededness" > of the system's CSPRNG (again, whatever that might mean) is a very > specialized user. There's no need to cater to them in these "Reliable, > userfriendly RNG APIs". The (metaphorical) 1% can look after > themselves. Whatever its size, it's a small minority that genuinely > cannot accept the kind of randomness that /dev/urandom on Linux or > /dev/random on FreeBSD or OS X offer. > > Further, the concepts of seededness of an RNG are very advanced > matters that are not well understood and that vary from one system to > another. Standardizing these semantics across platforms is hard. So > making these complications portable over different operating systems > is, I imagine, beyond difficult. > > And if you aim to make an API that exposes such subtleties, you need > to be able to clearly explain in the manual what it means in both > technically accurate terms and in practical terms that a non- > specialist application developer can base a design decision on. I > certainly couldn't do that. > > To, to summarize. > > - The requirement for a easy-to-use function to obtain crypto-secure > randomness is very clear. Has been for years in my view.
Agree 100%. > - Name the functions so the crypto-secure feature is obvious, e.g. > cs_random_bytes() I'm less sure on this point. I think people will get confused "what's the difference between mt_rand and cs_random?" and then just use rand() anyway. I think the way we solve this is though documentation instead. Keep the name simple, and document it well... > - The functions should not expose or allow selection of degrees of > "strength" of crypto-secureness (it's both a footgun and a semantic > tar pit). Just use the non-blocking system source and make a note in > the manual so the specialist users know what's going on. Agree 100% > - A function to get a random text string drawn from the 64-byte > alphabet of URL-transparent chars is very useful. > > - Don't complicate the random string getter without first establishing > the requirement for such complication. > > - Don't offer a crypto-secure random integer getter unless the > requirement for such a thing is clear. Well, there are cases such as UUID generation, contests, etc which need to pick numbers in a defined range. Also, if it's a drop-in replacement for mt_rand, so existing could could be migrated without having to be rewritten (a bonus for legacy users). Anthony -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php