php - 加密电子邮件、散列密码并将其存储在数据库中?

标签 php mysql security web-applications

首先,我对加密和散列的理解:

  1. 加密 - 可解密
  2. 哈希 - 无法取消哈希

构建 Web 应用程序时,我应该:

  1. 使用加密 key 加密电子邮件地址(将用于登录)。能够解密电子邮件地址以供以后使用(例如向用户发送电子邮件)真是太好了
  2. 使用盐对密码进行哈希处理。没有人应该能够看到用户的密码,因此散列(因为它是单向的)是很好的。

如果以上两点正确,我应该将加密 key 和盐存储在哪里?

如果我将其存储在数据库中,那么如果数据库受到损害,这似乎有点毫无意义。不过,好处是我可以为每个用户分配唯一的加密 key 和盐。

我应该将加密 key 和盐存储在应用程序的配置中吗?如果数据库被泄露,至少加密 key 和盐不会被泄露(希望如此)。问题在于,这可能意味着每个人都共享相同的加密 key 和盐。

建议做什么?

最佳答案

如果您对电子邮件进行加密,则需要使用普通的盐/ key 来进行加密。否则,您如何通过数据库中的电子邮件地址选择用户来检查哈希密码是否正确?您无法每次都解密每个电子邮件地址。

总的来说,我认为加密电子邮件地址几乎没有什么好处。如果需要,可以使用 MySQL 数据库加密,但不必在应用程序级别担心这一点。

用于散列密码的盐应该/需要是唯一的并且可以存储在数据库中,事实上它可以是散列本身的一部分。请参阅http://www.openwall.com/phpass/以获得良好的实现。

关于php - 加密电子邮件、散列密码并将其存储在数据库中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7900530/

相关文章:

php - 在 HTML 中使用时,PHP 语法的最佳实践是什么?

javascript - php脚本在系统本地工作但不在服务器上工作

php - 如何演示 extract($_POST) 的利用?

php - 时间戳查询未检索到结果?

java - SHA-1 哈希在使用自定义 REALM 的基于 jboss 表单的身份验证中不起作用

security - 如果使用HTTPOnly cookie,是否需要CSRF中间件?它应该是基于 session 的吗?

php - Laravel Blade @lang() 本地化中的多元化?

javascript - MySql 和 PHP 循环绘制带有 x,y 坐标的正方形

python - 如何使用 mysqlconnector 获取 sqlalchemy.create_engine 以使用 mysql_native_password 进行连接?

javascript - 离开页面后返回谷歌地图 V3 上的标记