2015-11-13 161 views
3

我有一段信息是使用aes-256-cbc加密编码的。我应该如何将它存储在数据库中?目前我正在使用VARCHAR(255)utf8_bin。这是好的,还是应该使用其他字段类型,如VARBINARY(255)?在这种情况下是否有可能使用VARCHAR丢失一些数据?谢谢。如何在AES数据库中存储AES加密密码

+4

你不应该加密你的用户密码。你需要使用散列,而不是一些强大的PBKDF2,bcrypt和scrypt。由于散列函数是单向函数,因此您将无法“解密”散列。为了验证您的用户,您可以再次通过散列函数运行密码,以便与存储在数据库中的散列进行比较。查看更多:[如何安全地哈希密码?](http://security.stackexchange.com/q/211/45523) –

+2

这是不可能强调这一点:**不要存储密码**。 – xxbbcc

+0

我从来没有说过我正在加密用户的帐户密码。这只是一些敏感数据,不需要以纯文本格式存储。很高兴为我们的用户提供功能。 –

回答

5

的存储加密的(相对于散列)尽管在一个数据库密码可能的(上)是否适当,AES密文是二进制数据,因此should be stored as such,即在一个BINARY/VARBINARY柱或BLOB

也可以对密文进行编码,例如,作为base64,然后将其存储在文本(即CHAR/VARCHAR/TEXT)列中。这不太节省空间,但它可能有时更方便,例如,当直观地检查数据或在可能无法处理包含任意二进制数据的字段的程序之间传递数据时。

+0

我想了解将这些数据存储为UTF8文本的后果是什么。 varchar - >文本字符串; varbinary - >二进制字符串。为什么我不应该把它保留为UTF8文本,如果它是一个字符串呢。 –

+2

AES密文可以包含无效的UTF-8字节序列,所以我不会试图将其视为这样。我没有测试过是否会发生任何数据损坏*,但不能保证它*不会*。考虑到有一个更合适的工具('VARBINARY')可用,使用''latin1'' *这样的单字节字符集'VARCHAR'可能会更安全,但我不会使用它。 –