> On 7 Nov 2016, at 03:35, Scott Arciszewski <sc...@paragonie.com> wrote: > >> On Sun, Nov 6, 2016 at 2:19 PM, Jakub Zelenka <bu...@php.net> wrote: >> Hi, >> >> On Thu, Nov 3, 2016 at 4:11 PM, Scott Arciszewski <sc...@paragonie.com> >> wrote: >>> >>> Hi, >>> >>> Can we change openssl_public_encrypt() and openssl_private_decrypt() from >>> defaulting to PKCS1v1.5 padding, in favor of defaulting to OAEP? >>> >>> I'll create an RFC for this later. It will just prevent a lot of issues. >>> >>> To wit: >>> >>> - https://framework.zend.com/security/advisory/ZF2015-10 >>> - >>> >>> https://github.com/garyr/portunus/blob/89853c180c85c71baac7015cb77ff8ddae129942/src/Portunus/Crypt/RSA/PrivateKey.php#L20 >>> - >>> >>> https://github.com/NorseBlue/Sikker/blob/c158bab1e676d751e5228cb17ecf9593c6b94e95/src/Asymmetric/Keys/PrivateKey.php#L72 >>> >>> If we can't stop PHP developers who aren't cryptographers from writing >>> their own high-level RSA implementation, we can at least make it safer by >>> default. >>> >> >> We can't change default in 7.x as it would be a BC break and in this case a >> very hard to catch BC break as the only way how we could let user know about >> that is a documentation. This is a very low level function and PKCSv1.5 is >> still used a lot so some apps might depend on. I think that the default is >> bad but I don't think that breaking both function without notice is a good >> solution as users might not be able to catch it especially if it's some >> third party protocol that is not very secure but you don't have choice >> because 3rd party won't change it (that was actually the only case where I >> used these functions in practice so it's not made up). And even worse if you >> don't have tests, then it breaks just production without a warning... >> >> What I would prefer instead is to deprecate calling >> openssl_(private|public)_(en|de)crypt without a padding parameter. The >> default would stay the same but user would get a deprecation message and the >> parameter would become required in PHP 8. We should add a note to the doc, >> to let the user know what the safest option is. It means OAEP for >> openssl_private_decrypt and openssl_public_encrypt. In case of >> openssl_public_decrypt and openssl_private_encrypt, we support just >> PKCS1v1.5 but if we add support for PSS (would require a little bit of >> tweaking as it works on EVP level only but might add it later), we could >> easily recommend it then. >> >> I have got actually very similar plan for openssl_seal and openssl_open that >> have default method rc4. Again very bad default but the best way how to let >> user know is to deprecate it rather than choose new default and break >> compatibility. >> >> Cheers >> >> Jakub >> >> > > Hi Jakub, > >> We can't change default in 7.x as it would be a BC break and in this case a >> very hard to catch BC break as the only way how we could let user know about >> that is a documentation. > > A sane proposal had emerged before I even received this email, via > kemmeta on Reddit: > > https://www.reddit.com/r/PHP/comments/5axmn5/phpinternals_openssl_new_defaults_proposal/d9kx8sa/?context=1 > > A backwards-compatible interface would default > openssl_public_encrypt() to OAEP, but openssl_private_decrypt() would > default to a new constant: OPENSSL_PKCS1_UNSPECIFIED, which when > passed would first try OAEP and, if a padding error occurred, emit an > E_DEPRECATED and fallback to PKCS1v1.5 (a.k.a. "let's pretend Daniel > Bleichenbacher's research doesn't exist" mode). > > The upside is that better security would be applied opportunistically > in codebases where the PHP developer was not a cryptographer. The > downside is a performance hit unless you specify one mode or another. > > A long term solution would be to not even use RSA anymore. > >> I have got actually very similar plan for openssl_seal and openssl_open that >> have default method rc4. Again very bad default but the best way how to let >> user know is to deprecate it rather than choose new default and break >> compatibility. > > If your plan is to get it more in line with libsodium's > crypto_box_seal API, I'd love to see it. > > Scott Arciszewski > Chief Development Officer > Paragon Initiative Enterprises > > -- > PHP Internals - PHP Runtime Development Mailing List > To unsubscribe, visit: http://www.php.net/unsub.php >
Hey, It might make even more sense to not provide a default here at all. As history shows that those methods that are considered secure today can become less-than-desirably secure in a couple of years. Which means the same cycle of deprecation/changing defaults in years to come. -- PHP Internals - PHP Runtime Development Mailing List To unsubscribe, visit: http://www.php.net/unsub.php