之前就该问题得到过大家的帮助,但本人还是有些疑惑,再次请教大家给予指导。我设计的程序基本原理是:启动运行程序,若发现没有密码文件,则弹出创建密码对话框,要求用户设置密码,单击“创建密码”按钮后,在系统中生成密码文件,并将该用户设置的密码写入,待用户下次使用时,比对用户键入的密码是否存在于密码文件中。比对成功之后才可登陆软件。我的疑问:
1、我是应该将生成的密码文件加密,还是将密码文件中的密码字符串加密呢?若只加密密码字符串,是不是被别人打开后删除几个字符在保存,该密码文件就不能用了!若是这样,那我是不是应该选择加密文件才对呢?2、若我选择将整个密码文件加密,我查了很多资料,都需要公钥或者私钥,而且加密后的文件在解密,密码文件名和原来的就不一样了,例如:密码文件.txt,解密后叫:密码文件1.txt,我的程序就无法读取了!我该怎么做?3、有没有当我单击“创建密码”按钮后,若没密码文件,则创建一个新的密码文件,然后将密码写入,再然后加密该密码文件。比较密码的时候,先解密密码文件,在查找密码文件中是否有用户输入的密码。4、我的一个想法:可不可以先将用户设置的密码写入一个 TextBox text = new TextBox(); 然后加密text,并将其生成一个存储在C盘下的密码文件呢,比对的时候,先将加密文件解密读取到text中在进行比对!这个能实现吗?
说这么多,我都快晕了,呵呵,希望大家能看的明白,给予我帮助!

解决方案 »

  1.   

    第一个问题。
    对字符串加密就可以了。其实加密字符串和加密文件,并没有实质性的区别。按照你的理解,好像无非是认为前者是文本文件,后者是二进制文件而已。任何文件其实质都是以二进制形式存储的,可以用十六进制编辑器(比如UltraEdit)查看和编辑。即使按照你的意思加密整个文件,仍然可以用十六进制编辑器修改之(和你说的“删除几个字符”没有本质区别)。一旦文件修改,当然该文件就不能用了。第二个问题。
    按照你的需求,根本不需要用到公钥私钥机制(不对称加密),用对称加密甚至散列算法就足够解决问题了。不对称加密既复杂又消耗运行时间。不对称加密常用于防止网络传输中的敏感信息被窃听,你不需要用到。对称加密你不需要自己去发明,用现成的,推荐使用.NET自带的System.Security.Cryptography.Rijndael。加密解密后文件名不一样,编程解决起来应该不是难事吧。而且这种情况下最好应是在内存中解密,而不是解密到硬盘上。第三个问题。
    如上所述,最好是创建新密码文件后,在内存中对密码加密,最后一次性写入文件。当然如果觉得内存中加解密技术上有难度,按照你的方法也是勉强可行的。第四个问题。
    在第二个问题中我提到了“散列算法”,你可以用.NET自带的MD5CryptoServiceProvider。将用户设置的密码进行MD5运行,得到一个散列值,存储到文件。用户登陆时,输入密码,程序计算其密码的MD5散列值,与文件中的散列值对比,若相等,认证成功。这种方法比你的方法更简单,Windows登陆就这样做的。为了安全,你可以在MD5计算加入盐(salt),具体什么意思可以百度一下(关键词“MD5 盐”)。
      

  2.   

    你问的问题很乱,我回答的也很乱,总结一下。
    按照你的需求,我觉得你没有必要用到对称加密或非对称加密,而应当用散列算法(比如MD5)。因为密码是不需解密的。也就是说,程序只需要验证用户的身份就行,而不需要知道他的密码是多少。事实上,像QQ,论坛,网上银行都是这样,就连开发者和系统管理员也无法知道用户的密码(也不需要知道)。管理员能做的只是判断用户密码是否正确,进行密码重置操作而无法进行“密码查询”操作。如果你觉得确实有必要进行“密码查询”操作,应当使用对称加密而不是非对称加密。加密和解密都应在内存中运行,而没有必要在硬盘上生成第二个文件(比如你说的“密码文件1.txt”)。