using System;
using System.IO;
using System.Security.Cryptography;
using System.Text;

namespace ConsoleApp_PreventFileTampering
{
class Program
{
static void Main(string[] args)
{
//TestGetFileHash();

TestGetMd5();
}

#region 通过Hash值来验证文件是否被篡改

public static void TestGetFileHash()
{
string fileHash = "";
while (true)
{
fileHash = GetFileHash(@"C:\error.txt");
Console.WriteLine("文件MD5-HASH值为:{0}", fileHash);
Console.ReadKey();
//手动修改文件试试,HASH值会变化
//手动将刚才的修改恢复,HASH值会还原
}
}

/// <summary>
/// 通过Hash值来验证文件是否被篡改
/// </summary>
/// <param name="argFilePath">文件路径</param>
/// <returns>输出Hash值</returns>
public static string GetFileHash(string argFilePath)
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
using (FileStream fs = new FileStream(argFilePath, FileMode.Open, FileAccess.Read, FileShare.Read))
{
return BitConverter.ToString(md5.ComputeHash(fs)).Replace("-", "");
}
}

#endregion

#region 对字符串用MD5加密

public static void TestGetMd5()
{
while (true)
{
Console.WriteLine("输入要加密的字符串:");
string input = Console.ReadLine();
string md5 = GetMd5Hash2(input);
Console.WriteLine("输出的加密字符串为:" + md5 + "\r\n");
Console.ReadLine();
}
}

/// <summary>
/// 将字符串转换成MD5值存储
/// 【直接使用本方法加密MD5是不安全的,可以通过穷举法获得加密前的字符串】
/// </summary>
/// <param name="argInput">输入的字符串</param>
/// <returns>输出的MD5值</returns>
public static string GetMd5Hash(string argInput)
{
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
return BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(argInput))).Replace("-", "");
}
}

/// <summary>
/// 多次使用MD5值以及内部拼hashKey法,增加穷举破解的难度
/// </summary>
/// <param name="argInput">输入的字符串</param>
/// <returns>输出特殊处理过的MD5值</returns>
public static string GetMd5Hash2(string argInput)
{
string hashKey = "Kae@#$@!,.Js+{f>.294oE";
using (MD5CryptoServiceProvider md5 = new MD5CryptoServiceProvider())
{
string hashCode = BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(argInput)))
.Replace("-", "")
+ BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(hashKey)))
.Replace("-", "");

return BitConverter.ToString(md5.ComputeHash(UTF8Encoding.Default.GetBytes(hashCode))).Replace("-", "");
}
}

#endregion

}
}

最新文章

  1. iniutils for Golang
  2. Javascript中的栈
  3. windows8.1下常用编辑器安装配置(emacs/vim/sublime text3)
  4. javascript获取元素的方法[xyyit]
  5. 2015年12月28日 Java基础系列(六)流
  6. Mac上常用的一些命令
  7. centos中设置apache显示目录列表
  8. 面向函数范式编程(Functional programming)
  9. Curling 2.0(dfs)
  10. acdream1412:2-3 trees 组合数dp
  11. JWeb备忘录
  12. 星际争霸反作弊AG对战平台_支持108,113
  13. jquery-easyui实现页面布局和增删改查操作(SSH2框架支持)转载
  14. Sublime text3 设置的中文翻译
  15. kafka 0.8.2 消息生产者 producer
  16. Orleans---持久化
  17. [解读REST] 4.基于网络应用的架构风格
  18. 《2018面向对象程序设计(Java)课程学习进度条》
  19. ubuntu MySQL的卸载
  20. 【Jmeter】if控制器+循环控制器+计数器,控制接口分支

热门文章

  1. IGS_学习笔记05_IREP开发Concurrent Program为客户化集合接口(案例)
  2. OAF_EO系列5 - Update详解和实现(案例)
  3. Ubuntu离线安装包制作(转载)
  4. View的缩放操作--CGAffineTransformMakeScale:
  5. trim
  6. 《一课经济学》书摘笔记I
  7. wall 和panel有啥区别
  8. IE10修改select样式
  9. Functions类,一个Javascript的函数加法类,将两个函数加起来,顺序执行
  10. Hive基础之自定义封装hivefile命令