Php 如何在MySQL数据库中存储openssl\u public\u encrypt()输出?
我需要从PHP在MySQL中存储一个加密但可恢复的(管理员)密码。好的,最简单的方法是使用openssl_public_encrypt(),但我不确定需要什么列类型。我可以根据密钥和输入的大小对加密输出的最大长度做出可靠的判断吗Php 如何在MySQL数据库中存储openssl\u public\u encrypt()输出?,php,mysql,openssl,Php,Mysql,Openssl,我需要从PHP在MySQL中存储一个加密但可恢复的(管理员)密码。好的,最简单的方法是使用openssl_public_encrypt(),但我不确定需要什么列类型。我可以根据密钥和输入的大小对加密输出的最大长度做出可靠的判断吗 或者我被迫使用一个巨大的字段(例如BLOB),只希望它能一直工作?openssl\u public\u encrypt函数将可以加密的数据大小限制在密钥长度内,如果使用填充(推荐),则会额外丢失11个字节 但是,OpenSSL使用的PKCS#1标准指定了一个填充方案(因
或者我被迫使用一个巨大的字段(例如BLOB),只希望它能一直工作?openssl\u public\u encrypt函数将可以加密的数据大小限制在密钥长度内,如果使用填充(推荐),则会额外丢失11个字节 但是,OpenSSL使用的PKCS#1标准指定了一个填充方案(因此可以在不丢失安全性的情况下加密较小的数量),并且该填充方案至少需要11个字节(如果加密的值较小,则会更长)。因此,使用1024位密钥可以加密的最高位数是936位(除非通过添加OPENSSL_NO_padding标志禁用填充,在这种情况下,可以增加到1023-1024位)。如果使用2048位密钥,则为1960位 当然,您应该永远不要禁用填充,因为这将使相同的密码加密到相同的值 因此,对于1024位密钥,最大密码输入长度为117个字符。
对于2048位密钥,它是245个字符 我不能100%确定输出长度,但一个简单的跟踪应该可以证实这一点,输出是keylength的简单函数,因此对于2048位密钥,我怀疑它是256字节 您应该使用具有所需长度的
二进制
字符串来存储密码。出于速度原因,最好在字段上使用有限长度索引。
不要使用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
创建表用户
id无符号整数自动递增主键,
用户名varchar(50)不为空,
密码RSA二进制(256),以可逆加密方式存储密码是个坏主意。你应该使用一个盐渍散列来代替。这是一个要求,也是我问题的前提。你有没有任何文档参考说明输出严格来说是键长度的函数?我总是可以运行测试,但这不能证明我的设计超出了测试用例的范围。@CakeLad,这是算法的逻辑结果。