MySQL是一种常用的关系型数据库管理系统,常用于Web应用程序的开发。当我们创建用户和授权时,MySQL会要求我们为新用户设置密码。那么这些密码是如何保存的呢?
MySQL密码是经过散列(hash)算法加密后存储在系统表mysql.user中的。具体来说,密码是通过MySQL自带的密码函数进行加密后存储的。这个函数叫做PASSWORD,它可以将输入的字符串转换成一个40个字符长的散列值,用于存储在mysql.user表中。
以下是一个例子,在MySQL client中输入以下命令:
mysql>SELECT PASSWORD("mypassword");+-------------------------------------------+| PASSWORD("mypassword") |+-------------------------------------------+| *2E45F8133B258009F0EBD041EAFAF2015A630421 |+-------------------------------------------+
可以看到,输入"mypassword"后,MySQL会返回40字符的加密结果。这个结果即为密码在mysql.user表中存储的形式。
当我们尝试使用上述用户登录MySQL时,MySQL会将我们输入的密码进行加密后和mysql.user中存储的密码进行比对。如果比对成功,则用户登录成功;否则,登录失败。
需要注意的是,在MySQL 5.7之后,官方已不再推荐使用PASSWORD函数进行密码加密了。官方推荐使用更安全的加密方式,如SHA256。
在应用程序中,我们通常不会直接使用MySQL的密码散列值进行验证,而是使用第三方库对密码进行加密。这些库使用更加安全的加密方式,并且通常还会加入一些密码安全策略,如密码过期、强制密码复杂度等。