如何在MySQL数据库中存储openssl_public_encrypt()输出?

时间:2011-12-15 08:34:08

标签: php mysql openssl

我需要在PHP中存储加密但可恢复的(通过管理员)密码。 AFAIK,最直接的方法是使用openssl_public_encrypt(),但我不确定需要什么列类型。我可以根据密钥的大小和输入对加密输出的最大长度做出任何可靠的判断吗?

或者我被迫使用一个巨大的领域(例如BLOB),并希望它一直有效?

1 个答案:

答案 0 :(得分:2)

openssl_public_encrypt函数将可加密数据的大小限制为密钥长度,如果使用填充(推荐),则会丢失额外的11个字节。

  

但是,OpenSSL使用的PKCS#1标准指定了一个填充方案(因此您可以加密较小的数量而不会失去安全性),并且该填充方案至少需要11个字节(如果值为你,它将会更长) '加密更小)。因此,使用1024位密钥加密的最大位数是936位(除非您通过添加OPENSSL_NO_PADDING标志来禁用填充,在这种情况下,您可以达到1023-1024位)。使用2048位密钥而不是1960位。

当然你应该从不禁用填充,因为这会使相同的密码加密到相同的值。

因此对于1024位密钥,最大密码输入长度为117个字符 对于2048位密钥,它是245个字符。

我不是100%确定输出长度,但是一个简单的跟踪应该确认这一点,输出是密钥长度的简单函数,因此对于2048位密钥,我怀疑它是256字节。

您应该使用具有所需长度的binary字符串来存储密码 出于速度原因,最好在场地上使用有限长度的指数 不要使用blob(!),因为这样会减慢速度,但没有任何好处。

CREATE TABLE user
  id unsigned integer auto_increment primary key,
  username varchar(50) not null,
  passRSA binary(256),      <<-- doublecheck the length.
  index ipass(passRSA(10))  <<-- only indexes the first 10 bytes for speed reasons. 
) ENGINE = InnoDB  

向索引添加额外的字节只会减慢速度并增加索引文件,但没有任何好处。