如何隐藏数据库密码?

doocoo 2009-07-17 10:17:00
我在用C#+SQL Server Compact Edition做一个程序。现在有个问题是:数据库文件不能被用户直接打开,所以要设定一个密码。但密码写在哪里呢?如果写在工程properties的connectstring里面或写在代码里面,都很容易用反编译工具ILDASM等看到。即便用模糊化处理,细心一点还是能找到的。
怎么办?这个问题应该和所有加密数据库都有关。
...全文
62 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
xhueducls 2009-07-17
  • 打赏
  • 举报
回复
.NET的反破解本来就不是很强,只有这样了
doocoo 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zhiyu19 的回复:]
给你两个例子吧,你参考一下
[/Quote]

谢谢,不过你这个方法,基础是SQL Server,但我要用的是SQL Server CE,是文件型的数据库,数据文件是在客户端的。我是担心数据文件被直接打开。
如果用你这个方法来加密Password,那人家一反编译,就知道你是怎么加密的了,解密也就很简单。
zhiyu19 2009-07-17
  • 打赏
  • 举报
回复
给你两个例子吧,你参考一下
加密:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
using System.IO;
using System.Text;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
string strCon = "Data Source=(local);Database=db_15;Uid=sa;Pwd=";
SqlConnection sqlcon = new SqlConnection(strCon);
string sqlstr = "select * from tb_Employee";
SqlDataAdapter myda = new SqlDataAdapter(sqlstr, strCon);
DataSet myds = new DataSet();
sqlcon.Open();
myda.Fill(myds);
sqlcon.Close();
myds.WriteXml("test.xml");
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Xml1.Document = doc;
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Visible = true;
FileStream oldXml = new FileStream(test.xml",FileMode.OpenOrCreate,FileAccess.Read,FileShare.Read);
EncodeXml("testNew.xml",oldXml);
XmlDocument doc1 = new XmlDocument();
doc1.Load("test.xml");
Xml1.Document = doc1;
XmlDocument doc2 = new XmlDocument();
doc2.Load("testNew.xml");
Xml2.Document = doc2;
Button1.Enabled = false;
}
public void EncodeXml(string newXml, FileStream oldXml)
{
byte[] buffer = new byte[1024]; ;
int readbyte = 0;
XmlTextWriter xw = new XmlTextWriter(newXml,Encoding.UTF8);
xw.WriteStartDocument();
xw.WriteStartElement("root");
BinaryReader br = new BinaryReader(oldXml);
do
{
readbyte = br.Read(buffer,0,1024);
xw.WriteBase64(buffer,0,readbyte);
}
while (1024 <= readbyte);
xw.WriteEndElement();
xw.WriteEndDocument();
xw.Flush();
xw.Close();
}
}

解密:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;
using System.Xml;
using System.IO;
using System.Text;

public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
XmlDocument doc = new XmlDocument();
doc.Load("test.xml");
Xml1.Document = doc;
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Visible = true;
FileStream newXml = new FileStream("testNew.xml",FileMode.Create,FileAccess.ReadWrite,FileShare.ReadWrite);
decodeXml("test.xml",newXml);
XmlDocument doc = new XmlDocument();
doc.Load("testNew.xml");
Xml2.Document = doc;
}
public void decodeXml(string oldXml, FileStream newXml)
{
byte[] buffer = new byte[1024]; ;
int readbyte = 0;
BinaryWriter bw = new BinaryWriter(newXml);
XmlTextReader tr = new XmlTextReader(oldXml);
tr.MoveToContent();
do
{
readbyte = tr.ReadBase64(buffer, 0, 1024);
bw.Write(buffer, 0, readbyte);
}
while (1024 <= readbyte);
bw.Flush();
bw.Close();
}
}

xml文件也顺便发给你吧
<?xml version="1.0" standalone="yes"?>
<NewDataSet>
<Table>
<EmployeeID>2</EmployeeID>
<EName>张三</EName>
<ESex>男</ESex>
<EAge>28</EAge>
<EPlace>北京市</EPlace>
<EMoney>3000</EMoney>
</Table>
<Table>
<EmployeeID>3</EmployeeID>
<EName>李四</EName>
<ESex>女</ESex>
<EAge>23</EAge>
<EPlace>上海市</EPlace>
<EMoney>3000</EMoney>
</Table>
<Table>
<EmployeeID>4</EmployeeID>
<EName>王五</EName>
<ESex>女</ESex>
<EAge>26</EAge>
<EPlace>天津市</EPlace>
<EMoney>2000</EMoney>
</Table>
</NewDataSet>
doocoo 2009-07-17
  • 打赏
  • 举报
回复
用这些方法,都可能被人反编译程序,可以看到整个加密或者序列化等等的过程。这样还是会让人搞出来。
如果是用户登录密码,用MD5等不可逆的加密法是可以,但数据库怎么办呢?
zhiyu19 2009-07-17
  • 打赏
  • 举报
回复
可以把记录加密保存到XML文件里,用的时候再解密调用
doocoo 2009-07-17
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 jsoner 的回复:]
序列化后用XML保存,觉得不放心,可以先加密再序列化.
[/Quote]
序列化后用XML保存,您指的是密码字符串?还是在数据库中保存序列化后的数据?
jsoner 2009-07-17
  • 打赏
  • 举报
回复
序列化后用XML保存,觉得不放心,可以先加密再序列化.
doocoo 2009-07-17
  • 打赏
  • 举报
回复
没有人碰到过这问题吗?我指的是C# WinForm程序,如果是WebForm倒好办了。
xhueducls 2009-07-17
  • 打赏
  • 举报
回复
考虑加密后放在config中,代码中进行解密。
  • 打赏
  • 举报
回复
up

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧