[走火入魔失眠夜]浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】
2010-09-30 04:05 通用C#系统架构 阅读(9185) 评论(37) 编辑 收藏 举报不是不想做高科技,在没有能力做高科技时就把低科技做得稳定、成熟、绝对可靠,能重复利用吧,欢迎阅读草根技术博文
[什么是幸福?天天在做自己想做的事情,家人、同事、朋友、客户、网友都和和睦睦,身体健康、钱包鼓鼓、身边美女同事多多赏心悦目、生活无忧无虑就是最大的幸福]
少废话、少广告,直接看下图
1:用户名可以不加密、但是密码需要在公司的加密能力内以不可逆的方式进行单项加密,至少是要保证同等水平的人无法破解,效果看图。
我有一个好朋友,刚参加工作3-4年的样子,他在杭州工作、软件开发水平蛮厉害、工作也负责的那种,开发公司的内部薪资管理系统,当他看到他的主管的薪水只有6000后,几乎要绝望崩溃了,因为他的主管接近工作了7-8年,而且能力还不错,他自己已月薪5000,但是还希望能更高一些,但是他知道了他的主管也就税前6000后,差点儿崩溃了。
A:怎么可能他能拿主管还高的薪水?
B:他就是干得比主管还好,能拿多少呢?
C:他的前途一片迷茫了,杭州的房价目前是2万左右,啥时候才能买房子娶老婆?
其实他不知道主管的薪水吧,可能还干劲十足,想干得更好、更出色,对前途一片憧憬,但是他的上级主管才能拿这么点儿后,可能开始动摇了,一切都可能发生变化了,其实在打工的时候我最怕我身边的人薪资都比我低、我最开心的是,周围的人都比我拿得高,因为这样我才有加薪的希望、前途一片光明。
若在管理软件的开发过程中、测试工程中、使用过程中,能有一定的数据保密手段,那至少我的好朋友也不会对未来绝望、在这个公司可能开开心心、干劲十足的工作几年,就像我们知道明天地球就要毁灭大家都要挂掉了,还有几个人还会好好干活了?还干个屁啊对吧,所以信息系统的保密工作还是需要加强的,特别是对敏感数据的保护、商业机密的保护措施一定要做到位,最起码需要有保护的意识,我们自己不要犯罪,但是不要引诱别人犯罪就好。
2:用户登录时、需要保存密码时,不管是B/S的C/S的架构,都需要有可逆的密码。
我们先看看B/S系统的例子
我们再看看配套的C/S系统的例子
突然间想起来,接近10年前的事情,那时候还在宁波一家台资企业工作,当时公司来了一个有1年工作经验的程序员,公司要求他写一个登录程序,足足写了1周,最后没办法搞定了放弃了、缴枪了,原因很简单,做好一个经得起考验的登录程序,不容易,需要深入考虑的因素很多很多。
附上配套的,不可逆的C#加密函数参考。
/// 用户密码加密函数
/// </summary>
/// <param name="password">密码</param>
/// <returns>加密值</returns>
public static string md5(string password)
{
return md5(password, 32);
}
/// <summary>
/// 加密用户密码
/// </summary>
/// <param name="password">密码</param>
/// <param name="codeLength">多少位</param>
/// <returns>加密密码</returns>
public static string md5(string password, int codeLength)
{
if (!string.IsNullOrEmpty(password))
{
// 16位MD5加密(取32位加密的9~25字符)
if (codeLength == 16)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower().Substring(8, 16);
}
// 32位加密
if (codeLength == 32)
{
return System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile(password, "MD5").ToLower();
}
}
return string.Empty;
}
再附上配套的,C#可加密解密的函数参考。
// 九 字符串加密解密部分
//
/// <summary>
/// DES数据加密
/// </summary>
/// <param name="targetValue">目标字段</param>
/// <returns>加密</returns>
public static string Encrypt(string targetValue)
{
return Encrypt(targetValue, "Project");
}
/// <summary>
/// DES数据加密
/// </summary>
/// <param name="targetValue">目标值</param>
/// <param name="key">密钥</param>
/// <returns>加密值</returns>
private static string Encrypt(string targetValue, string key)
{
return SecretUtil.Encrypt(targetValue, key);
}
/// <summary>
/// DES数据解密
/// </summary>
/// <param name="targetValue">目标字段</param>
/// <returns>解密</returns>
public static string Decrypt(string targetValue)
{
return Decrypt(targetValue, "Project");
}
/// <summary>
/// DES数据解密
/// </summary>
/// <param name="targetValue"></param>
/// <param name="key"></param>
/// <returns></returns>
private static string Decrypt(string targetValue, string key)
{
return SecretUtil.Decrypt(targetValue, key);
}
/// <summary>
/// DES数据加密
/// </summary>
/// <param name="targetValue">目标值</param>
/// <param name="key">密钥</param>
/// <returns>加密值</returns>
public static string Encrypt(string targetValue, string key)
{
if (string.IsNullOrEmpty(targetValue))
{
return string.Empty;
}
var returnValue = new StringBuilder();
var des = new DESCryptoServiceProvider();
byte[] inputByteArray = Encoding.Default.GetBytes(targetValue);
// 通过两次哈希密码设置对称算法的初始化向量
des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
Substring(0, 8), "sha1").Substring(0, 8));
// 通过两次哈希密码设置算法的机密密钥
des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
.Substring(0, 8), "md5").Substring(0, 8));
var ms = new MemoryStream();
var cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
foreach (byte b in ms.ToArray())
{
returnValue.AppendFormat("{0:X2}", b);
}
return returnValue.ToString();
}
/// <summary>
/// DES数据解密
/// </summary>
/// <param name="targetValue"></param>
/// <param name="key"></param>
/// <returns></returns>
public static string Decrypt(string targetValue, string key)
{
if (string.IsNullOrEmpty(targetValue))
{
return string.Empty;
}
// 定义DES加密对象
var des = new DESCryptoServiceProvider();
int len = targetValue.Length / 2;
var inputByteArray = new byte[len];
int x, i;
for (x = 0; x < len; x++)
{
i = Convert.ToInt32(targetValue.Substring(x * 2, 2), 16);
inputByteArray[x] = (byte)i;
}
// 通过两次哈希密码设置对称算法的初始化向量
des.Key = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5").
Substring(0, 8), "sha1").Substring(0, 8));
// 通过两次哈希密码设置算法的机密密钥
des.IV = Encoding.ASCII.GetBytes(FormsAuthentication.HashPasswordForStoringInConfigFile
(FormsAuthentication.HashPasswordForStoringInConfigFile(key, "md5")
.Substring(0, 8), "md5").Substring(0, 8));
// 定义内存流
var ms = new MemoryStream();
// 定义加密流
var cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
cs.Write(inputByteArray, 0, inputByteArray.Length);
cs.FlushFinalBlock();
return Encoding.Default.GetString(ms.ToArray());
}
友情连接:
软件的价值在于能重复利用、为人民提供有价值的服务。
吉日嘎拉 不仅权限管理 :的含义时,不只是C#ASP.NET通用权限管理,是一个整体的开发理念、分层理念、面向服务的理念、信息化建设的基础工具、帮程序员赚钱的开发辅助工具,帮业余开发者实现拥有自己的一套信息管理系统的强有力可参考的源码积累,当然也可以做为C#编程开发的入门标准教程。