MD5算法原理简要介绍并采用C#应用在桌面应用系统的用户登录与注册中

接上文,本文简要介绍一下MD5加密算法的原理,并采用C#实现MD5算法的加密与解密过程,将这一实现过程应用在我自己开发的桌面办公应用-工资管理系统  中的用户注册与登录模块,有需要进一步了解的博友可以在下面留言或者可以加我QQ:1974544863(记得备注:"桌面办公应用"),我可以与您一同交流其中实现的原理。

MD5,是message-digest(即“信息-摘要”)的简称,是一种加密算法,具有不可逆性,简要地说:“MD5是以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值”。具体的原理可以参考这篇csdn博客 :MD5算法原理。

我虽然喜欢算法,但在开发软件过程中,考虑到软件的开发周期,就没深入研究MD5的具体原理,而只是从中抽取了核心的关键点:明文,密钥key,密钥。 从这点入手,去网上搜索几篇采用C#实现MD5算法的代码,之后导入自己的项目工程中,一步一步加breakpoint,单步debug,最后实现了自己想要的效果!

下面介绍采用C#实现MD5算法的代码,正如上面提到的,核心关键点有明文,密钥key,密钥这三点,所以代码也就主要有三个功能方法MD5Encrypt(string pToEncrypt, string sKey),GenerateKey(),MD5Decrypt(string pToDecrypt, string sKey)。下面是代码(在代码有部分进行了注释,就不再进行详解,若想知晓每一句代码的原理,请你参考上面提到的那篇参考博客MD5算法原理)。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;
using System.IO;namespace SMS.cmmMessage
{class MD5EncryptAndDecrypt{// 创建Keypublic string GenerateKey(){DESCryptoServiceProvider desCrypto = (DESCryptoServiceProvider)DESCryptoServiceProvider.Create();//将产生的tempKey采用ASCII进行编码return ASCIIEncoding.ASCII.GetString(desCrypto.Key);}///MD5加密public string MD5Encrypt(string pToEncrypt, string sKey){DESCryptoServiceProvider des = new DESCryptoServiceProvider();byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();StringBuilder ret = new StringBuilder();foreach (byte b in ms.ToArray()){ret.AppendFormat("{0:X2}", b);}ret.ToString();return ret.ToString();}///MD5解密public string MD5Decrypt(string pToDecrypt, string sKey){DESCryptoServiceProvider des = new DESCryptoServiceProvider();byte[] inputByteArray = new byte[pToDecrypt.Length / 2];for (int x = 0; x < pToDecrypt.Length / 2; x++){int i = (Convert.ToInt32(pToDecrypt.Substring(x * 2, 2), 16));inputByteArray[x] = (byte)i;}des.Key = ASCIIEncoding.ASCII.GetBytes(sKey);des.IV = ASCIIEncoding.ASCII.GetBytes(sKey);MemoryStream ms = new MemoryStream();CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);cs.Write(inputByteArray, 0, inputByteArray.Length);cs.FlushFinalBlock();StringBuilder ret = new StringBuilder();return System.Text.Encoding.Default.GetString(ms.ToArray());}}
}

值得说明的是,我这个实现的是:产生的密文是16位的,当然你也可以改改成为32位的,或者网上搜搜!

算法的研究如果只是停留在研究的层次,或者研究只是为了书写一大堆学术论文的话,我个人觉得没多大意思。像我一直比较崇拜的MSRA,就真的是将研究的成果应用到诸多产品中,我觉得那才有意思!(可惜自己能力有限啊,不然真的想去MSRA跟那堆牛人共事!)。

因为自己最近正好在自己开发一套企业使用的工资管理系统,其中涉及到用户注册于登录模块,对于投身应用软件开发的人而言,势必需要经常与“安全”打交道,因为,正如上文提到的“有应用系统就会有用户,有用户就会涉及到登录注册,涉及到登录注册则势必与密码挂钩,而有密码则会涉及到安全,想到了安全则自然需要想到加密”。正是这样的想法驱动,我将C#实现的MD5加密解密算法应用了我开发的桌面办公应用系统-工资管理系统中。

实现的过程,核心的地方有两点:一点是三个核心关键:明文,密钥key,密钥;另一点是在key上再拼接自定义的一段字符串!

下面以我自主开发的工资管理系统为例,下面是注册界面与代码:我们只关心用户的登录密码,其他的用户信息的处理以及含义在后续博文中会陆续介绍!


    在窗体初始化方法之后,加上下面一段定义MD5加解密类的对象

        //加密解密工具MD5EncryptAndDecrypt md5 = new MD5EncryptAndDecrypt();

在保存时候,即注册用户时候,保存用户的登录密码那一段代码是这样的:

            //加密密码与密钥String loginKeyTemp=md5.GenerateKey();//产生临时密钥String loginPasswordEncrypt=md5.MD5Encrypt(empLoginPassword,loginKeyTemp);//产生密文String loginKeyEncrypt=loginKeyTemp+CommonMessage.lastKeyStr;//产生真正存储的密钥

之后,数据库中的用户表中关于登录密码的需要有两个字段:loginPassword,loginKey,其中loginPassword存储的是用户明文密码加密后的密文,loginKey存储的是真正的密钥(当然了,真正有用的是那个临时的密钥:需要截断自定义的那段拼接的字符串)。

所以在登录时候,代码是这样的

        //登录事件private void buttonLogin_Click(object sender, EventArgs e){try{string userName = textBoxUserName.Text.Trim();string userPwd = textBoxPwd.Text.Trim();if (userName == "" || userPwd == ""){MessageBox.Show("用户名或密码不能为空!", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Information);return;}else{String[] loginFieldNames = new String[]{"loginPassword","loginKey"};String tempSQL = " from tb_employee where loginName='" + userName + "'";String strSql = cmmUtils.organizeSqlStatementWithFields(loginFieldNames, tempSQL);Console.WriteLine(strSql);String[] dataResults = operate.GetDatasFromSelectedTable(strSql.ToString(), loginFieldNames);//不存在该用户名if (dataResults==null){MessageBox.Show("该用户名不存在!", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}else{String loginPasswordEncrypt = dataResults[0];//用户名对应的登录密码 String loginKeyTemp = dataResults[1];//用户名对应的加了拼接字符串的登录密钥String loginKeyReal = loginKeyTemp.Substring(0, loginKeyTemp.IndexOf(CommonMessage.lastKeyStr));//截断后才是真正的密钥String loginPasswordDecrypt = md5.MD5Decrypt(loginPasswordEncrypt, loginKeyReal);//解密密文if (!userPwd.Equals(loginPasswordDecrypt)){MessageBox.Show("用户密码错误!", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Information);}else{//MessageBox.Show("登陆成功!", "友情提示", MessageBoxButtons.OK, MessageBoxIcon.Information);this.Hide();
<span style="white-space:pre">         </span>    //密码匹配正确即成功登录:记录当前的用户名与用户密码CommonMessage.userName = userName;CommonMessage.userPassword = userPwd;String[] selFieldNames = new String[]{//主要用于获取当前用户的用户权限"powerName"};String tempPowerSQL = " from tb_employee,tb_powerType where tb_employee.powerId=tb_powerType.powerId and tb_employee.loginName='" + userName + "'";String strPowerSql = cmmUtils.organizeSqlStatementWithFields(selFieldNames, tempPowerSQL);String[] dataPowerResults = operate.GetDatasFromSelectedTable(strPowerSql.ToString(), selFieldNames);CommonMessage.userPower = dataPowerResults[0];frmMain fMain = new frmMain();fMain.ShowDialog();}}}}catch (System.Exception ex){MessageBox.Show(ex.Message + "\n请与管理员联系!", "错误信息", MessageBoxButtons.OK, MessageBoxIcon.Information);}}

以上即为采用C#实现MD5加密算法的代码并将其应用在我的工资管理系统中的用户注册登录模块中!

MD5算法原理简要介绍并采用C#应用在桌面应用系统的用户登录与注册中相关推荐

  1. C++安全方向openssl(三):3.2 md5算法原理详解以及代码实现

    如下图: 由上可知,任意大小的数据经过md5算法是都是4个字节. 涉及到新的安全相关的内容,不再用md5了.通过md5算法的分析我们应该知道我们通过什么方式实现不可逆,又是通过什么方式实现修改一处内容 ...

  2. MD5算法原理与常用实现

    目录 定义 MD5特点 常见应用场景 1.校验文件的完整性 2.存储用户密码 原理 1.填补信息 2.拿到初始值 3.真正的计算 MD5为什么不可逆 java实现和使用 定义 MD全称Message- ...

  3. 【密码学】MD5算法原理

    MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:     ...

  4. 【编程开发】MD5算法原理

     MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),经MD2.MD3和MD4发展而来.MD5算法的使用不需要支付任何版权费用. MD5功能:     ...

  5. 计算机专业毕业生、求职升学面试 项目亮点,算法原理 双语介绍思路与样例

    文章大纲 项目亮点 样例 背景 背景(简洁版) 技术上的亮点 业务上的亮点 算法工程师 自我介绍与评价样例 中文 英文 项目经历 口述DEMO 工作描述 项目描述 面试算法原理 叙述逻辑举例 KMea ...

  6. MD5算法原理及其实现

    什么是MD5算法 MD5讯息摘要演算法(英语:MD5 Message-Digest Algorithm),一种被广泛使用的密码杂凑函数,可以产生出一个128位元(16位元组)的散列值(hash val ...

  7. php md5 file算法原理,MD5算法原理与实现

    //MessageDigestAlgorithm5.cpp #include "stdafx.h" #include "MessageDigestAlgorithm5.h ...

  8. MD5算法原理及实现

    MD5的概述 MD5由美国密码学家罗纳德·李维斯特(Ronald Linn Rivest)设计,于1992年公开,是一个典型的密码散列函数,MD5方法将所有的文件看作为一个个的文本文件,通过不可逆 的 ...

  9. JSF 原理简要介绍

    JSF(Java Server Faces)的本质也是Servlet,只不过实现Servlet的方式不同而已. 那到底JSF是怎样的Servlet呢,有比较才会有不同.总结相同,区分不同. 首先,JS ...

最新文章

  1. 【引用】Android程序实现完全退出
  2. <文献阅读>用转移熵通过微阵列的时间序列推断基因调控网络(inferring gene regulatory networks from microarray time series data
  3. 用极大似然法估计因子载荷矩阵_第7章-因子分析.ppt
  4. could not export python function call Remove calls to Python functions before export
  5. Vue+Openlayers实现地图上绘制线
  6. 1.App瘦身经验总结
  7. 编程寓言:两位新手正讨论常用快捷键,路边乞丐直接说出答案!
  8. 《高质量c++/c编程指南》学习摘要
  9. 【python】踩坑:ImportError: numpy.core.multiarray failed to import
  10. Rust基础概念之数据类型
  11. 《构建之法》 第5.5 第6 第7章
  12. 免费股票量化交易软件有哪些?
  13. 【vue】使用手机app扫描二维码登录
  14. 爱的5种能力,你有吗?
  15. 如何制作校园平面图及路线导图
  16. 低代码学习教程:根据身份证号码计算性别
  17. 51单片机实现电机控制和LCD显示
  18. 把扫描文件转变为word文档的最实用的四款OCR识别软件
  19. 电销企业外呼系统如何选最合适?
  20. JAVA与西门子S7 PLC通信,方式一:S7connector

热门文章

  1. 从微信打开链接不能正常上下滑动
  2. 沉舟侧畔千帆竞,百舸争流稳为先——正雅齿科
  3. 转正实习、春招、秋招、校招、社招的4个区别和陷阱
  4. Android 微信支付总结
  5. PMP之总价合同、成本补偿合同、工料合同
  6. Vulnhub靶机系列:SecTalks: BNE0x03 - Simple
  7. 动态iptables 防火墙
  8. 银达汇智 智慧综合管理平台 FileDownLoad.aspx 任意文件读取漏洞
  9. 如何实现在线视频播放?
  10. class_weights的计算方式