Php 在MVC架构中,应该在哪里进行密码加密

Php 在MVC架构中,应该在哪里进行密码加密,php,model-view-controller,codeigniter,encryption,Php,Model View Controller,Codeigniter,Encryption,我正在一个中型PHP CodeIgniter网站上创建基本的密码安全性。我需要开始加密保存到数据库中的密码。可以使用不同的方法插入用户密码,包括CSV导入或单个注册方法 因此,我只想知道在MVC系统中,密码应该加密的正确级别是什么 您只需在添加新用户或更新现有用户密码时执行此功能。这两个功能都应该由用户模型执行。例如,类似于: $user = new User(); $user->setName('...'); $user->setPassword('...'); $user->

我正在一个中型PHP CodeIgniter网站上创建基本的密码安全性。我需要开始加密保存到数据库中的密码。可以使用不同的方法插入用户密码,包括CSV导入或单个注册方法


因此,我只想知道在MVC系统中,密码应该加密的正确级别是什么

您只需在添加新用户或更新现有用户密码时执行此功能。这两个功能都应该由用户模型执行。例如,类似于:

$user = new User();
$user->setName('...');
$user->setPassword('...');
$user->save();
或:

在本例中,setPassword()方法将执行实际的加密


另外,请这样想——不可能在系统中获得未加密的密码。因此,您使用户模型成为与用户交互的唯一方式,并让它透明地加密所有提供给它的密码。

这一切取决于您存储密码的方式

我通常会:

  • 创建密码字段设置为nothing(非null)的用户
  • 将用户插入数据库,从而生成新的UserID
  • 使用新插入的UserID,再加上一些额外的salt来生成密码和存储
  • 如果您没有使用用户ID或运行时生成的(即插入时)salt,那么您可以同时插入和加密密码

    编辑

    抱歉,我继承了您对加密的使用,但是对于密码,您“应该”只对密码进行哈希运算

    一个简单的例子是:

    md5(md5(UserID).md5('Password'))
    
    然后,当用户键入他们的电子邮件/用户名和密码时,您只需这样做:

    select * from User where Username = 'myusername' and Password = md5(concat(md5(UserID), md5('Password')))
    

    不解密密码。

    后续问题:将数据库中的信息加载到此用户类中,您是否要创建一个新方法来加载已加密的密码字段?不,它与加载任何其他字段(如用户名或电子邮件地址)没有区别。数据库存储密码的加密形式,这就是调用$user->getPassword()时得到的结果。未加密的表单从来没有存储在任何地方。我的评论没有被清除,我的问题是关于使用setPassword方法。如果我从数据库获取信息,我将获得加密的密码,因此使用setPassword($row->password)将加密已经加密的密码。所以我认为我应该在DB中创建一个附加的方法setPasswordFromDB,在这里我不加密它。这听起来像是一个合适的解决方案吗?不。
    setPassword()
    是一个公共方法。从数据库创建对象的方法应该是私有的,并且只能间接调用(比如通过
    find()
    )——因此可能只是直接设置受保护的属性。例如:
    $this->password=
    select * from User where Username = 'myusername' and Password = md5(concat(md5(UserID), md5('Password')))