The least disruptive change would be to have it as the last arg, and default to 
the current all-null value.

Perhaps you could do this and add a warning akin to the date.timezone if none 
is passed?

Having said that, I don't think the disruption would be too bad, I haven't seen 
much use of the openssl stuff in the
wild; it's pretty much pointless anyways, everybody knows you can decrypt 
anything with a modem coupler and
any 15 year old kid...

Another option, is an openssl_set_iv($iv); method, that would setup for 
openssl_encrypt/decrypt to use, otherwise
use the current all-null option....

This has the added benefit of being as global as you like, and no need to keep 
passing the IV to encrypt/decrypt
all over the place. It has the potential of clashing when you bring multiple 
codebases together however (i.e a framework).
Possible to limit to a single namespace?

- Davey


On May 17, 2010, at 9:53 PM, Sara Golemon wrote:

> I was just looking through the implementation of openssl_encrypt() (and 
> openssl_decrypt()) today because I need to make some encrypted payloads, but 
> the prototype didn't have anywhere to place an initialization vector.
> 
> On opening ext/openssl/openssl.c, I noticed line 4620 which simply hardcodes 
> IV as a string of NULL bytes.
> 
> This is a bad idea roughly equivalent to hashing passwords without salt; 
> Worse, it prevents interoperability at the application layer by preventing 
> the decryption of a data stream where the generator used an IV other than 
> all-null.
> 
> Fixing this is a simple matter, but I wanted to bounce approaches for BC (or 
> lack thereof) off everyone else since this version of openssl_encrypt() is 
> already "in the wild".
> 
> The most direct and obvious solution is to add a fifth, optional parameter to 
> openssl_encrypt() and openssl_decrypt() to take IV as a string.  The problems 
> with this are that it: (A) Places the IV in an odd argument location, and (B) 
> Does not enforce the passing of an IV (since raw is already optional).  As 
> stated above, IV really *should* be enforced, given what it does to soften 
> the security normally offered by a chaining block method.
> 
> That said, I'd like to propose something unpopular;   Change the signature 
> for these methods entirely, deliberately breaking BC.  I know, I know.... 
> spare me your rotten tomatoes.  I think it's justified in this case because, 
> as they are now, these functions are useless at best, and possibly dangerous 
> in terms of encouraging unsafe practices with regards to cryptography.
> 
> I think it's worth a BC break.  Comments?
> 
> -Sara
> 
> P.S. - Here's the signature I'd go with: openssl_encrypt($data, $method, $iv, 
> $key, $raw=false)
> 
> -- 
> PHP Internals - PHP Runtime Development Mailing List
> To unsubscribe, visit: http://www.php.net/unsub.php
> 


--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to