Php 在MVC架构中,应该在哪里进行密码加密
我正在一个中型PHP CodeIgniter网站上创建基本的密码安全性。我需要开始加密保存到数据库中的密码。可以使用不同的方法插入用户密码,包括CSV导入或单个注册方法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->
因此,我只想知道在MVC系统中,密码应该加密的正确级别是什么 您只需在添加新用户或更新现有用户密码时执行此功能。这两个功能都应该由用户模型执行。例如,类似于:
$user = new User();
$user->setName('...');
$user->setPassword('...');
$user->save();
或:
在本例中,setPassword()方法将执行实际的加密
另外,请这样想——不可能在系统中获得未加密的密码。因此,您使用户模型成为与用户交互的唯一方式,并让它透明地加密所有提供给它的密码。这一切取决于您存储密码的方式 我通常会:
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')))