从c#将敏感信息存储在keepass数据库中

我有一个项目,我必须处理敏感数据。 你知道如何打开一个keepass数据库表单c#来使用数据吗?

我已经下载了这些来源。 我会看看它得到我需要的东西。 还有其他想法吗?

我考虑过读一个KeyPass 2数据库,所以我在Linqpad中添加了对KeyPass.exe的引用并开始试验。 令我惊讶的是,没有任何外界的帮助(certificate了一个好的API),我只是在几分钟之后就读了数据库。 我是这样做的:

var dbpath = @"C:\path\to\passwords.kdbx"; var masterpw = "Your$uper$tr0ngMst3rP@ssw0rd"; var ioConnInfo = new IOConnectionInfo { Path = dbpath }; var compKey = new CompositeKey(); compKey.AddUserKey(new KcpPassword(masterpw)); var db = new KeePassLib.PwDatabase(); db.Open(ioConnInfo, compKey, null); var kpdata = from entry in db.RootGroup.GetEntries(true) select new { Group = entry.ParentGroup.Name, Title = entry.Strings.ReadSafe("Title"), Username = entry.Strings.ReadSafe("UserName"), Password = entry.Strings.ReadSafe("Password"), URL = entry.Strings.ReadSafe("URL"), Notes = entry.Strings.ReadSafe("Notes") }; kpdata.Dump(); // this is how Linqpad outputs stuff db.Close(); 

检查: KeePass密码安全 (关于keepass如何工作)

而是使用C#System.Cryptography类并将您存储的数据存储在数据库或txt文件中……

有一个KeePass-2.05-Alpha-Source.zip,最新版本的KeePass。 C#源代码,1919KB

这是Ronnie原始答案的延伸 – 递归地走过keepass树。 这将输出jsTree可以使用的格式。

  public static void JsonData() { var dbpath = Web.MapPath(@"your-password-file.kdbx"); var masterpw = "Your$uper$tr0ngMst3rP@ssw0rd"; var ioConnInfo = new IOConnectionInfo { Path = dbpath }; var compKey = new CompositeKey(); compKey.AddUserKey(new KcpPassword(masterpw)); var db = new KeePassLib.PwDatabase(); db.Open(ioConnInfo, compKey, null); //get everything var kpdata = from entry in db.RootGroup.GetEntries(true) select new { Group = entry.ParentGroup.Name, Title = entry.Strings.ReadSafe("Title"), Username = entry.Strings.ReadSafe("UserName"), Password = entry.Strings.ReadSafe("Password"), URL = entry.Strings.ReadSafe("URL"), Notes = entry.Strings.ReadSafe("Notes") }; var kproot = db.RootGroup.Groups; string lastGroup = "#"; uint sc = 0; int depth = 0; var parent = "#"; //root is # parent foreach (var entry in kproot) { PwGroup pwGroup = db.RootGroup.Groups.GetAt(sc); Web.Write(" { \"id\" : \"" + (sc) + "\", \"parent\" : \"" + parent + "\", \"text\" : \"" + pwGroup.Name.HtmlEncode() + "\" },\n"); WriteChildren(pwGroup,sc+"", depth + 1); sc++; } db.Close(); } public static void WriteChildren(PwGroup pwGroup, string parentID,int depth) { uint sc = 0; //if(depth>3)return; //used to prevent too much recursion foreach (var entry in pwGroup.Groups) { var subGroup = pwGroup.Groups.GetAt(sc); var curID = (parentID+"_"+sc); Web.Write(" { \"id\" : \"" + curID + "\", \"parent\" : \"" + parentID + "\", \"text\" : \"" + subGroup.Name.JsEncode() + "\"},\n"); WriteChildren(subGroup, curID, depth+1); WriteLeaves(subGroup, curID, depth); sc++; } } public static void WriteLeaves(PwGroup pwGroup, string parentID,int depth) { uint sc = 0; //if(depth>3)return; var entryList = pwGroup.GetEntries(false); foreach (var entry in entryList) { var curID = (parentID+"_"+sc); Web.Write(" { \"id\" : \"" + curID + "\", \"parent\" : \"" + parentID + "\", \"text\" : \"" + entry.Strings.ReadSafe("Title").JsEncode() + "\", \"password\" : \"" + entry.Strings.ReadSafe("Password").JsEncode() + "\", \"type\" : \"file\"},\n"); sc++; } }