假设你在设计自己的系统的时候采用的是MVC架构。例如

也许可能有很多童鞋会这样设计Service和Model.

service:

public class AccountService
{
    public bool Login(string userName, string password)
    {
        // insert into account values(userName,password);
        return true;
    }

public bool Register(string userName, string password)
    {
        // select count(*) from account where userName = userName and password = password;
        return true;       
    }
}

然后model是这样的:

public class UserModel
{
    public bool Login(string userName, string password)
    {
        string encryptedPassword = password.MD5();

AccountService accountService = new AccountService();
        return accountService.Login(userName, encryptedPassword);
    }

public bool Register(string userName, string password)
    {
        string encryptedPassword = password.MD5();

AccountService accountService = new AccountService();
        return accountService.Register(userName, encryptedPassword);       
    }
}

很明显,这段代码完成了注册和登录的任务,并且密码也是以加密的形式保存的。

比如123456 =>e10adc3949ba59abbe56e057f20f883e

当然有些人会认为密码不够安全,然后进行两次md5,或者是加salt,加userName,等。

下面抛一个问题:聪明的你认为上面的这种设计安全吗???

如果你认为上面的代码很安全,那么你就很需要往下面看看了。

Service和Model这样设计的缺点:

1:加密在model层中做,如果你有多个界面的话,我指的是客户端(asp.net,android,php…).然后这些客户端调用的是service层中的方法,那么这些客户端都需要先将密码进行加密,然后调用服务。

现在需要增加php客户端,android 客户端。于是变成了:

所以asp.net Model, php Model, android Model 都需要进行相同的加密,并且你需要保证这三个平台所加密的字符串是相同的,

比如123456 =>在这三个Model层中都必须被加密为:e10adc3949ba59abbe56e057f20f883e

这是一个很恶心的问题,不过幸运的是这三个平台的md5 加密出来的是一样的,如果不一样的话,可能是需要设置下字符编码。

2:上面的这个缺点虽然比较严重,但还不是最致命的,这个设计最致命的地方在于Service层没有进行加密验证,如果你获取了用户的用户名和密码的话,直接登录就OK了。

假设A用户的用户名为LoveJenny,密码为123456.

在数据库中储存的值是LoveJenny,e10adc3949ba59abbe56e057f20f883e。

对于hacker而言,他偶然获取了用户名:LoveJenny,密码:e10adc3949ba59abbe56e057f20f883e

首先他尝试试用LoveJenny 和e10adc3949ba59abbe56e057f20f883e 来调用Service服务登录系统,f**k,Service 没有验证,于是他便登录了,他不需要知道LoveJenny的密码是123456,同时也不需要理解e10adc3949ba59abbe56e057f20f883e 是怎样生成的,他只需要输入用户名:LoveJenny,然后密码:e10adc3949ba59abbe56e057f20f883e 来调用服务就可以登录了。

最后如果你还是认为:

1:他是怎样偶然得到LoveJenny和e10adc3949ba59abbe56e057f20f883e 的?

这点我无法回答,因为我也不知道hacker会怎样获取,不过可以肯定的是,只要你的系统不是很安全的话,应该是可以获取的。

2:多个model中做验证没什么大不了的?

这点我持反对意见,首先它违反了don’t repeat your self 原则,其次,把本该服务层中做的事情放到

model层来做,最后假设你的系统有多个平台的话,很郁闷的哦。

3:就算知道用户名和数据库密码,他又怎样绕过model来调用服务呢?

这个。。。,我还是不知道,不过万一你的服务是暴露在外网上的,如果你老板想让你做个开放平台,如果你的服务器被hacker掉了。。。,当然如果很多很多。。,借口

不要认为安全是个组件,到时候拿过来用就行了,个人认为在开发和设计的时候,就应该考虑安全,当然绝对的安全是不可能的,我们只能保证我们该做的都做了,而不是把这些安全漏洞归咎于上面的几点,或者是更多点。

最后的最后我贴上我认为正确的设计:

Service层:

public class AccountService
{
    public bool Login(string userName, string password)
    {
        string encryptedPassword = getEncryptedString(password);

// insert into account values(userName,encryptedPassword);
        return true;
    }

public bool Register(string userName, string password)
    {
        string encryptedPassword = getEncryptedString(password);

// select count(*) from account where userName = userName and password = encryptedPassword;
        return true;       
    }
}

Model层:

public class UserModel
{
    public bool Login(string userName, string password)
    {
        AccountService accountService = new AccountService();
        return accountService.Login(userName, password);
    }

public bool Register(string userName, string password)
    {
        AccountService accountService = new AccountService();
        return accountService.Register(userName, password);       
    }
}

转载于:https://www.cnblogs.com/LoveJenny/archive/2012/07/09/2582080.html

注册和登录还有那个加密的密码相关推荐

  1. 总结学过的技术,实现加密注册,登录及过期不能访问,微信朋友圈功能,文章比较长,但是比较详细。

    一.可以使用的技术 开发环境 idea,node.js 技术 虚拟机 Linux,docker mysql,redis jdbc,jsp,servlet mybatis,mybatis-plus sp ...

  2. 登录与注册时两次md5加密过程详解

    1 当前端传送密码到后端时候,需要进行两次MD5加密,登录和注册时的加解密流程是怎么样的? 前端和后端加密都可以规定使用密码的某几位作为盐进行加解密操作,而这种约定俗成的盐选取操作只有程序员自己知道, ...

  3. 续谈登录相关数据的安全加密策略——密码泄露事件杂谈之二

    原文地址:续谈登录相关数据的安全加密策略--密码泄露事件杂谈之二 作为WEB应用密码存放示范程序的AntiyPassword Mixer开源发布之后,我们陆续收到微博私信.电子邮件等.令人觉得有些意外 ...

  4. 注册登录系统(含MD5加密,注册、登录、推出、注销账号)

    不废话,直接干 用户管理系统-登录(Login)篇(含MD5加密) 要引用的jar包有mysql-connector-java-5.1.44-bin.jar和log4j-1.2.15.jar(都可以在 ...

  5. Node.js实践----注册-登录-个人中心(更换密码、头像)接口实现(包含mysql数据库)

    项目结构目录如下 1.初始化 1.1创建项目 1.2 配置cors跨域 1.3配置解析表单数据 1.4初始化路由 1.5抽离用户路由模块中的处理函数 2.注册登录 2.1新建ev_user表 2.3注 ...

  6. 计算机考试用户名和密码,全国计算机等级考试报名系统账号注册和登录

    注册账号和登录 1. 河南省NCRE考生报名登录地址 2. 考生首次登录系统需要注册登录通行证,若考生有通行证账号,可以直接登录. 3. 考生也可使用其他账号登录,例如使用"QQ账号&quo ...

  7. 简单注册、登录、修改密码、忘记密码程序

    简单注册.登录.修改密码.忘记密码程序 来自一枚大二通信工程渣渣写的代码 #include<stdio.h> #include<stdlib.h> #include<st ...

  8. android注册文件打开,Android项目实战系列—基于博学谷(三)注册与登录模块

    由于这个模块内容较多,篇幅较长,请耐心阅读. 注册与登录模块分为三个部分 [x] [欢迎界面]() [x] [注册界面]() [x] [登录界面]() 一.欢迎界面 1.创建工程,命名为BoXueGu ...

  9. 【web渗透思路】任意账号的注册、登录、重置、查看

    前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章). 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员,edus ...

最新文章

  1. Opencv cv2.KalmanFilter 鼠标跟踪
  2. 透视宝移动端对Unity手机游戏引擎监控实现
  3. cad画固定长度的弧线_CAD绘制指定长度的圆弧的2种方法
  4. 工业和能源1994-2019年省级面板数据
  5. 3dmax外挂神器更新了|3dmax外挂在过去几年里,食住玩都更新记录了3dmax外挂的什么功能?
  6. audio realtek 耳机没声_解决Realtek High Definition Audio 声卡前面板耳机无声音方法
  7. 使用MySQL now函数的坑
  8. Android中隐藏屏幕键盘的方法
  9. 银联支付、支付宝支付和微信支付有什么优势?
  10. vertica MySQL_MySQL数据库之Vertica数据库的用法
  11. Google Adsense 西联汇款热点问题的说明
  12. python自动化测试学习笔记合集
  13. ETC收费交易流程规范
  14. ABP VNext学习日记7
  15. java+mysql基于ssm的校园快递代领系统
  16. 广州市启动文化之旅,连接海上丝绸之路
  17. 常见数据库优化面试题
  18. power bi世纪互联帮助连接
  19. Selenium的实现原理,一篇文章讲透彻!
  20. 联发科mtk和骁龙730哪个好_联发科G90T处理器和骁龙730哪个好 联发科G90T处理器跑分怎么样...

热门文章

  1. [react] react16跟之前的版本生命周期有哪些变化?
  2. 前端学习(3001):vue+element今日头条管理--项目初始化总结
  3. [html] 给内联元素加float与给块元素加float有什么区别?
  4. 前端学习(2613):action的方法
  5. 前端学习(1862)vue之电商管理系统电商系统之绘制默认头像
  6. 前端学习(661):逻辑运算符
  7. mybatis学习(48):列表信息查询
  8. 第十一期:30秒内便能学会的30个实用Python代码片段
  9. java学习(111):日期时间格式化
  10. python之按位运算