加密账号存储文件!!!求安全编程经验大牛:)
我们有个小组,想写一个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
谢谢大牛了~不过没有全看懂。。还要抽时间看点相关的东西啊。 --------------------编程问答--------------------
这个方法可以,而且非常好。绝对可行。
把这些 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#