-
Dmitry Chestnykh authored
WARNING: introduces API incompatibility! This package generates captcha representations on-the-fly; for instance, if captcha solution was "123456", every call to NewImage() using this sequence of digits would generate a different random image containing "123456"; similarly, NewAudio() would generate a different audio pronouncing the same sequence: 1, 2, 3, 4, 5, 6. If a user, instead of storing generated outputs, exposes this functionality from their server, which is the default and recommended behaviour, an attacker could try loading the same image or audio over and over again in attempt to arrive at the most correct optical/voice recognition result. Instead of using a global non-deterministic pseudorandom number generator to distort images and audio, this commit introduces a deterministic PRNG for each image/audio. This PRNG uses a combination of a global secret key (generated once during initialization from a system CSPRNG) and captcha id and solution to produce pseudorandom numbers for each representation deterministically. Thus, calling NewImage() with the same captcha id and solution at different times will result in the same image (ditto for NewAudio). To make results unique not only for different solutions, but also for ids, these incompatible changes to public API have been introduced: NewImage and NewAudio changed from: func NewImage(digits []byte, width, height int) *Image func NewAudio(digits []byte, lang string) *Audio to: func NewImage(id string, digits []byte, width, height int) *Image func NewAudio(id string, digits []byte, lang string) *Audio That is, they now accept an additional captcha `id` argument. No other interfaces changed. Described changes also improved performance of generating captchas.
90158fbe