首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MySQL数据库中存储openssl_public_encrypt()输出?

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

Stack Overflow用户
提问于 2011-12-15 16:34:08
回答 1查看 2K关注 0票数 4

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

或者我被迫使用一个很大的字段(例如BLOB),并希望它一直都能工作?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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 (!)因为这会让事情变慢而不会带来任何好处。

代码语言:javascript
复制
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  

向索引添加额外的字节只会减慢速度,并增加索引文件,而不会带来任何好处。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8517188

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档