您的位置:首页 > 编程语言 > C#

[走火入魔失眠夜]浅谈管理软件信息安全,用户名、密码的加密解密【附C#配套加密解密源码】

2010-10-24 13:09 921 查看
不是不想做高科技,在没有能力做高科技时就把低科技做得稳定、成熟、绝对可靠,能重复利用吧,欢迎阅读草根技术博文

[什么是幸福?天天在做自己想做的事情,家人、同事、朋友、客户、网友都和和睦睦,身体健康、钱包鼓鼓、身边美女同事多多赏心悦目、生活无忧无虑就是最大的幸福]

少废话、少广告,直接看下图



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>
/// 用户密码加密函数
/// </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());
}





友情连接:

谈谈数据加密的处理--提供各种算法处理http://www.cnblogs.com/wuhuacong/archive/2010/09/30/1839119.html

软件的价值在于能重复利用、为人民提供有价值的服务。

吉日嘎拉 不仅权限管理 :的含义时,不只是C#ASP.NET通用权限管理,是一个整体的开发理念、分层理念、面向服务的理念、信息化建设的基础工具、帮程序员赚钱的开发辅助工具,帮业余开发者实现拥有自己的一套信息管理系统的强有力可参考的源码积累,当然也可以做为C#编程开发的入门标准教程。





将权限管理、工作流管理做到我能力的极致,一个人只能做好那么很少的几件事情。

posted on 2010-09-30 04:05 吉日嘎拉 不仅权通用权限 阅读(2788) 评论(37) 编辑 收藏



评论

1928579

#1楼  回复 引用 查看  见图了...

2010-09-30 07:00 | pandaren

#2楼  回复 引用 查看 

早!你怎么没说加密敏感数据的方法?比如加密存储工资后如何做复杂查询?
2010-09-30 08:12 | devil0153

#3楼  回复 引用 查看 

发现所有的代码都是static的, 包括以前贴的代码.
2010-09-30 08:18 | mrfangzheng

#4楼  回复 引用 查看 

想知道加密的Salt保存在什么地方?
2010-09-30 08:21 | Artech

#5楼[楼主]  回复 引用 查看 

@mrfangzheng

这是工具类,用静态的,static是没关系的。每次都new反而效率很低了、而且还不好用。
2010-09-30 08:53 | 吉日嘎拉 不仅权限管理

#6楼  回复 引用 查看 

@Artech
我是把它放在web.config,然后用 aspnet_regiis 加密相应的节点。

2010-09-30 08:55 | 深海沉

#7楼  回复 引用 查看 

不知道 吉日 是怎么做的。
2010-09-30 08:55 | 深海沉

#8楼  回复 引用 查看 

咋这么容易失眠呢?
2010-09-30 08:58 | 风雨者2

#9楼[楼主]  回复 引用 查看 

目前是写死在应用程序里,代码中,没存在配置文件里。
引用Artech:想知道加密的Salt保存在什么地方?

2010-09-30 08:58 | 吉日嘎拉 不仅权限管理

#10楼  回复 引用 查看 

每到国庆就会想起毛主席,每当想起毛主席就会激起我的伟人梦。
2010-09-30 09:01 | 大气象

#11楼  回复 引用 查看 





不同意此做法,。。。

直接比对密文就行了嘛。。。。

2010-09-30 09:03 | Jon.Hong

#12楼  回复 引用 查看 

md5是哈希函数,也成摘要算法,这个不属于加密函数。DES是正宗的加密算法,三重DES加密的强度是最高的。
md5摘要算法现在已经不够安全了,随着王小云的论文,已经能够在几小时内得到可能的匹配。
2010-09-30 09:06 | ocean

#13楼  回复 引用 查看 

@ocean
严重同意
2010-09-30 09:10 | 深海沉

#14楼  回复 引用 查看 

引用吉日嘎拉 不仅权限管理:
@mrfangzheng

这是工具类,用静态的,static是没关系的。每次都new反而效率很低了、而且还不好用。

有些代码加密器,混淆器对静态操作支持的不好。
2010-09-30 09:11 | 置身珠海,学习与奋斗

#15楼  回复 引用 

B/S版的,你怎么加密密码的?我想传输的时候应该是用JS吧?
2010-09-30 09:17 | MarkLeo[未注册用户]

#16楼  回复 引用 查看 

引用ocean:
md5是哈希函数,也成摘要算法,这个不属于加密函数。DES是正宗的加密算法,三重DES加密的强度是最高的。
md5摘要算法现在已经不够安全了,随着王小云的论文,已经能够在几小时内得到可能的匹配。
前两天正好碰到一段32位的MD5密码,到CMD5上面试了下要收费,请问仁兄有没有根据王教授的理论开发的工具能帮忙逆一下?
2010-09-30 09:27 | 兆子

#17楼  回复 引用 查看 

密码要加密地球人都知道。
数据库用户表加一个字段作为Cookies自动登陆标示字段(弄个唯一约束)浏览器中保存此字段的值,再加个过期时间就可以记忆用户登陆状态,没必要把密码保存到客户端cookie中。
2010-09-30 09:30 | Star.Stroll

#18楼  回复 引用 查看 

就加密算法而言,你给出的例子安全系数较低;就其它部分而言,应该是程序员都知道的吧。。
↓↓↓↓
md5-->sha1
des-->3des or aes
2010-09-30 09:37 | LanceZhang

#19楼  回复 引用 查看 

我是来看吉日的...这文章内容比你整天吹水好多了..

2010-09-30 09:38 | koscarkos

#20楼  回复 引用 查看 

我一般加密登录信息时,对密码加密采用如下方式:
1.先用账号(account)进行MD5或者SHA1,然后截取出DES的key。
2.用截取出的key,采用DES加密密码(password)。
这样做,在我目前涉及到的多个项目里面,没出现问题。好处是张三的密码000000和李四的密码000000加密后是不同的,相对安全一点。

以前是采用salt的,但是考虑到有的用户需要找回密码,salt的话,不可逆了。
2010-09-30 10:01 | 古道轻风

#21楼  回复 引用 查看 

如果是加密薪水等敏感数据,如果数据库使用SqlServer,可以使用数据库本身的加密功能。
2010-09-30 10:02 | 古道轻风

#22楼  回复 引用 查看 

@古道轻风
找回密码改为重设密码就行了,
密码最好都是用不可逆的摘要算法来存储,

另在数据库存储密码用md5还是sha1无所谓,如果都能得到数据库存储的值了那说明已经不安全了,在这个情况下有N种更方便的办法比爆md5更方便的侵入系统,还费那劲干嘛

2010-09-30 10:17 | 亚历山大同志

#23楼  回复 引用 查看 

@亚历山大同志
你没明白我说的意思,MD5或者SHA1只是中间的一个步骤,为了不直接使用account做key而已。

作开发或者设计的应该知道,需求不是我们来定的。客户就要找回密码,不允许重置密码,这也是合情合理的。
2010-09-30 10:22 | 古道轻风

#24楼  回复 引用 

你应该把使用到的名称空间列一下吧,再吧需要下载的DLL给个地址吧··

2010-09-30 10:39 | 九幽龙吟[未注册用户]

#25楼  回复 引用 查看 

引用兆子:
引用ocean:
md5是哈希函数,也成摘要算法,这个不属于加密函数。DES是正宗的加密算法,三重DES加密的强度是最高的。
md5摘要算法现在已经不够安全了,随着王小云的论文,已经能够在几小时内得到可能的匹配。
前两天正好碰到一段32位的MD5密码,到CMD5上面试了下要收费,请问仁兄有没有根据王教授的理论开发的工具能帮忙逆一下?

信息摘要算法不是加密算法,不存在逆过程
王晓云教授的研究成果在于“碰撞”而非逆运算
2010-09-30 10:43 | Ariex

#26楼[楼主]  回复 引用 查看 

总算说了实话了,哈哈

引用koscarkos:我是来看吉日的...这文章内容比你整天吹水好多了..

2010-09-30 10:50 | 吉日嘎拉 不仅权限管理

#27楼  回复 引用 查看 

节前看到此文,觉得很舒心。
每天首页都是点“高科技”,其实心里面是不安的,只有看吉日的文章,觉得可以释放些压力....
Thank you!
2010-09-30 11:12 | 炭炭

#28楼  回复 引用 

引用炭炭:
节前看到此文,觉得很舒心。
每天首页都是点“高科技”,其实心里面是不安的,只有看吉日的文章,觉得可以释放些压力....
Thank you!
褒义还是贬义啊 呵呵
2010-09-30 11:25 | 路人子[未注册用户]

#29楼  回复 引用 查看 

@路人子
当然是褒义,绝对的真情实感。
2010-09-30 11:32 | 炭炭

#30楼  回复 引用 查看 

引用深海沉:
@Artech
我是把它放在web.config,然后用 aspnet_regiis 加密相应的节点。

这样所有User Account的Password加密都只能用相同的Salt了,我觉得让每个User Account采用不同的Salt更好。
我们采用的是专门用一个需要较高访问级别的表来保存每个User Account的Salt。
2010-09-30 12:07 | Artech

#31楼  回复 引用 查看 

@古道轻风
那我只能退散了,3DES吧

企业用的话最好硬件USB key+RSA

2010-09-30 12:31 | 亚历山大同志

#32楼  回复 引用 查看 

对,3DES或者AES都很好。

usb key 和 RSA密码不是很方便。我是建议财务和领导用RSA,一般员工就账号密码认证就好了。USB key给人感觉不是很安全,怕容易坏。
2010-09-30 13:02 | 古道轻风

#33楼  回复 引用 查看 

都有数据库的权限了,加密顶个鸟用啊,
2010-09-30 13:49 | szyicol

#34楼  回复 引用 查看 

usb-key吧 MD5还有暴力破解呢 加密过程中加上自己的salt
2010-09-30 15:07 | 超级奶崽

#35楼[楼主]  回复 引用 查看 

你是所有人里,最干脆,最彻底的人,服了。
引用szyicol:都有数据库的权限了,加密顶个鸟用啊,

2010-09-30 15:09 | 吉日嘎拉 不仅权限管理

#36楼  回复 引用 查看 

学习了,谢谢LZ
2010-10-02 11:32 | JerryT

#37楼  回复 引用 

引用Ariex:
引用兆子:
引用ocean:
md5是哈希函数,也成摘要算法,这个不属于加密函数。DES是正宗的加密算法,三重DES加密的强度是最高的。
md5摘要算法现在已经不够安全了,随着王小云的论文,已经能够在几小时内得到可能的匹配。
前两天正好碰到一段32位的MD5密码,到CMD5上面试了下要收费,请问仁兄有没有根据王教授的理论开发的工具能帮忙逆一下?

信息摘要算法不是加密算法,不存在逆过程
王晓云教授的研究成果在于“碰撞”而非逆运算
是在于"增加""碰撞"成功的概率.
看吉日的文章,如果你要认真,你就L了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐