当前位置:编程学习 > C#/ASP.NET >>

加密账号存储文件!!!求安全编程经验大牛:)

我们有个小组,想写一个Windows7的用户智能卡登陆程序。
就是拿智能卡存储的一个Id、输入的密码和数据文件中的账户信息进行比对么。之前折腾硬件部分,就把账户文件设成简单的明文的txt了。
现在需要一种加密方法。让这个存放账户密码信息的文件不能明文读取,从外部修改。但是拥有最高管理员权限的用户,可以通过程序窗口,对其他账号密码信息进行修改。
类似的比如QQ的聊天记录文件,直接看是加密的,登陆账号从聊天记录里查看,就是解密过的。
想问一下这个文件的结构应该是怎么样的。应该应用怎样的机制。

希望有相关安全编程经验的,能给指点迷津一下。给点思路啊 --------------------编程问答-------------------- 你把这个文件加上密,藏起来,不让人家找到,就没法直改了。
如果别人找到了,直接给你删了,你也没办法啊。 --------------------编程问答-------------------- 文件以加密后,以密文方式存储,别人就看不到内容了。
你用程序读的时候,可以在程序里先解密,再显示。
但是如果别人找到了这个文件,就算看不到内容,但也可以用二进制方式修改内容。那样的话,你也看不到内容了。 --------------------编程问答-------------------- @宁卫东 
谢谢~能给个加解密的大概思路吗?对于密码学的东西不是很清楚地说。
如果要隐藏,那怎么才能隐藏?作为单独的文件怎么让用户无法查看?还是插入写入到其他文件当中? --------------------编程问答-------------------- 自己顶一顶。。。有没有大牛可以指点一二啊~! --------------------编程问答-------------------- 加密文件,有很多方法,你可以在网上找一下。
也可以用一个很简单的办法,用二进制读取,取一个字节,取反,就是密文了。
解密的时候,再取反,就解回来了。
你可能觉得太简单了。不过也挺能唬人的。 --------------------编程问答-------------------- 隐藏文件,不是设为隐藏属性。
我的意思是说,你把文件写到系统文件夹下。
如C:\windows\
你随便起个名字,应该很难找到吧? --------------------编程问答-------------------- 很简单,你可以使用类似des的对方加密方式,不需要自己写加密方式,可以在网上找到对应的编程写法,.NET中自带

//方法  
        //加密方法  
        private static string Encrypt(string pToEncrypt)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            //把字符串放到byte数组中  
            //原来使用的UTF8编码,我改成Unicode编码了,不行  
            byte[] inputByteArray = Encoding.Default.GetBytes(pToEncrypt);
            //byte[]  inputByteArray=Encoding.Unicode.GetBytes(pToEncrypt);  

            //建立加密对象的密钥和偏移量  
            //原文使用ASCIIEncoding.ASCII方法的GetBytes方法  
            //使得输入密码必须输入英文文本  
            Byte[] key = { 0x01, 0x23, 0x45, 0x67, 0x88, 0xab, 0xcd, 0xef };
            Byte[] IV = { 0x12, 0x32, 0x57, 0x78, 0x91, 0xac, 0xcd, 0xef };
            des.Key = key;
            des.IV = IV;
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(), CryptoStreamMode.Write);
            //Write  the  byte  array  into  the  crypto  stream  
            //(It  will  end  up  in  the  memory  stream)  
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            //Get  the  data  back  from  the  memory  stream,  and  into  a  string  
            StringBuilder ret = new StringBuilder();
            foreach (byte b in ms.ToArray())
            {
                //Format  as  hex  
                ret.AppendFormat("{0:X2}", b);
            }
            ret.ToString();
            return ret.ToString();
        }
        //解密方法  
        private static string Decrypt(string pToDecrypt)
        {
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();

            //Put  the  input  string  into  the  byte  array  
            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;
            }

            //建立加密对象的密钥和偏移量,此值重要,不能修改  
            Byte[] key = { 0x01, 0x23, 0x45, 0x67, 0x88, 0xab, 0xcd, 0xef };
            Byte[] IV = { 0x12, 0x32, 0x57, 0x78, 0x91, 0xac, 0xcd, 0xef };
            des.Key = key;
            des.IV = IV;
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(), CryptoStreamMode.Write);
            //Flush  the  data  through  the  crypto  stream  into  the  memory  stream  
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();

            //Get  the  decrypted  data  back  from  the  memory  stream  
            //建立StringBuild对象,CreateDecrypt使用的是流对象,必须把解密后的文本变成流对象  
            StringBuilder ret = new StringBuilder();

            return System.Text.Encoding.Default.GetString(ms.ToArray());
        } --------------------编程问答-------------------- 要涉及到解密,你只能用这种对称加密方式来做 --------------------编程问答-------------------- @Carpathia

谢谢大牛了~不过没有全看懂。。还要抽时间看点相关的东西啊。 --------------------编程问答--------------------
引用 7 楼 carpathia 的回复:
很简单,你可以使用类似des的对方加密方式,不需要自己写加密方式,可以在网上找到对应的编程写法,.NET中自带

//方法  
  //加密方法  
  private static string Encrypt(string pToEncrypt)
  {
  DESCryptoServiceProvider des = new DESCryptoServiceProvider();……

这个方法可以,而且非常好。绝对可行。
把这些 Byte[] key = { 0x01, 0x23, 0x45, 0x67, 0x88, 0xab, 0xcd, 0xef };
  Byte[] IV = { 0x12, 0x32, 0x57, 0x78, 0x91, 0xac, 0xcd, 0xef };都换了。
然后加密钥匙自己写个比较复杂的应该比较安全了。 --------------------编程问答-------------------- C#本身就自带加密的类,DES和RSA都是现成的,可以查找一下相关的MSDN么。
--------------------编程问答-------------------- 加密很高深啊
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,