我需要存储一个加密的,但可恢复的(由管理员)在MySQL中的密码。AFAIK,最直接的方法是使用openssl_public_encrypt(),但是我不确定需要什么列类型。根据密钥和输入的大小,我能对加密输出的最大长度做出可靠的判断吗?
或者我被迫使用一个很大的字段(例如BLOB),并希望它一直都能工作?
发布于 2011-12-15 20:58:52
openssl_public_encrypt函数将您可以加密的数据大小限制为密钥的长度,如果您使用填充(推荐),您将丢失额外的11个字节。
然而,OpenSSL使用的PKCS#1标准指定了填充方案(因此您可以在不损失安全性的情况下加密较小的数量),并且该填充方案至少需要11个字节(如果加密的值较小,则会更长)。因此,您可以使用1024位密钥加密的最大位数是936位(除非您通过添加OPENSSL_NO_PADDING标志来禁用填充,在这种情况下,您可以加密到1023-1024位)。对于2048位的密钥,它是1960位。
当然,您永远不应该禁用填充,因为这将使相同的密码加密为相同的值。padding.padd.dll当然,你永远不要禁用填充,因为这会使相同的密码加密成相同的值。
因此,对于1024位密钥,密码输入的最大长度为117个字符。
对于一个2048位密钥,它是245个字符。
我不是百分之百确定输出长度,但简单的跟踪应该可以证实这一点,输出是键长的简单函数,所以对于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 向索引添加额外的字节只会减慢速度,并增加索引文件,而不会带来任何好处。
https://stackoverflow.com/questions/8517188
复制相似问题