我可以在不知道我的 MySQL 用户名/密码的情况下直接从这些文件中读取数据吗?
你打赌。
我正在考虑对应用程序中的凭据进行加密和解密,并仅将加密版本存储在数据库中,但这有必要吗?
不要将明文密码存储在您的数据库中,也不要使用对称加密(如果这样做,那么当您的密钥与加密密码一起被盗时,您就会丢失)。
存储密码的方法(在任何地方——无论你将它们存储在平面文件、数据库还是其他地方都无关紧要……)是使用安全的散列函数对它们进行加盐和散列。哈希函数接受一个输入字符串并返回一个固定长度的随机字符串作为输出。您将这个看起来随机的字符串存储在数据库中。
当您想检查是否有人输入了正确的密码时,您可以通过哈希函数运行密码,并根据数据库中的字符串检查结果字符串。
这样,密码就不会暴露(散列函数是单向函数,这意味着您不能不费力气就反转散列函数)。
请注意,仅对密码进行哈希处理是不够的。您必须在对密码进行散列之前将随机盐值连接到密码,然后将散列函数输出和盐值存储在数据库中。您需要这样做有几个原因: 1. 如果您不这样做,那么相同的密码将产生相同的哈希值 2. 有一些时间的人可以预先计算哈希密码表(彩虹表)。使用盐值会使此操作更加昂贵。
有可用于散列密码的散列函数,例如 bcrypt。使用其中一个而不是自己滚动。不要使用标准散列函数,例如 md5 或 sha1。它们都被设计为快速,这与您在密码哈希函数中想要的相反(当密码文件被盗时使暴力攻击更加困难)。