本文概述
KeePass是免费的开源密码管理器, 可帮助你以安全的方式管理密码。你可以将所有密码放在一个数据库中, 该数据库由一个主密钥或一个密钥文件锁定。该应用程序具有以下特点:
- KeePass支持高级加密标准(AES, Rijndael)和Twofish算法来加密其密码数据库。这两种密码都被认为是非常安全的。 AES例如已成为美国联邦政府的标准, 并获得了国家安全局(NSA)的批准, 用于提供最高机密信息。
- 完整的数据库被加密, 而不仅仅是密码字段。因此, 你的用户名, 注释等也已加密。
- SHA-256用于哈希主密钥组件。 SHA-256是256位加密安全的单向哈希函数。尚无针对SHA-256的攻击。使用密钥推导函数转换输出。
- 防止字典和猜测攻击:通过使用密钥派生功能(AES-KDF, Argon2等)转换主密钥组件哈希, 可以使字典和猜测攻击变得更加困难。
- 进程内存保护:KeePass运行时会加密你的密码, 因此即使操作系统将KeePass进程转储到磁盘上, 也不会泄露你的密码。
- [2.x]受保护的内存中流:加载内部XML格式时, 使用会话密钥对密码进行加密。
- 安全性增强的密码编辑控件:KeePass是第一个具有安全性增强的密码编辑控件的密码管理器。没有可用的密码编辑控件间谍对这些控件起作用。在KeePass的过程存储器中甚至看不到在这些控件中输入的密码。
- 主密钥对话框可以显示在安全的桌面上, 几乎没有键盘记录程序在该桌面上运行。也可以保护自动键入免受键盘记录程序的攻击。
由于应用程序使用公共逻辑, 因此存在使用不同的编程语言来处理此类文件的库, Java也不例外。在本文中, 我们将向你介绍如何使用Java操作KeePass数据库, 以创建自己的类似应用程序, 或仅从kdbx文件中提取信息。
1.安装Open KeePass库
为了操作KeePass数据库, 你将需要安装openkeepass库。 openkeepass是一个用于读写KeePass数据库的Java库。它是一个直观的Java库, 支持KeePass 2.x数据库文件。到目前为止, 该库提供以下支持:
- 对KeePass 2.x的读写支持
- 密码或密钥文件凭据:openkeepass可以打开受密码保护的数据库以及受密钥文件保护的数据库。
- Android支持:将在Android设备上运行。
- 易于学习的API:openkeepass具有使用方便方法的简单API, 可轻松从KeePass数据库读取数据。
- 非常精简:openkeepass尝试将必要的依赖项保持在绝对最低限度。
- 向后兼容直到Java 6
你可以从maven存储库下载软件包的jar文件, 然后将其手动包含在你的项目中, 或者如果你的项目基于maven, 则可以编辑pom.xml文件并添加依赖项:
<!-- https://mvnrepository.com/artifact/de.slackspace/openkeepass -->
<dependency>
<groupId>de.slackspace</groupId>
<artifactId>openkeepass</artifactId>
<version>0.8.1</version>
</dependency>
有关此项目的更多信息, 请访问Github上的官方资源库。
2.提取信息
就像我们《代码世界》中的所有内容一样, 你将边做边学, 因此, 当你尝试使用这些文件时, 我们将向你解释如何处理最基本的需求:
打印所有凭证
如果你只是从某人那里获得了KeePass数据库, 而你只需要获取信息而不必担心分类, 则可以使用以下逻辑轻松地将文件中所有存储的凭证打印出来:
package com.ourcodeworld.mavensandbox;
// Import required class
import de.slackspace.openkeepass.KeePassDatabase;
import de.slackspace.openkeepass.domain.Entry;
import de.slackspace.openkeepass.domain.KeePassFile;
import java.util.List;
public class Index {
public static void main(String[] args){
// 1. Open a KeePass database file through a plain text password
KeePassFile database = KeePassDatabase
.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
.openDatabase("12345");
// 2. Retrieve all entries
List<Entry> entries = database.getEntries();
// 3. Print every entry
for (Entry entry : entries) {
System.out.println(" * Credential: " + entry.getTitle());
System.out.println(" Username: " + entry.getUsername());
System.out.println(" Password: " + entry.getPassword());
}
}
}
该逻辑将在终端中生成以下输出:
* Credential: Sample Entry
Username: User Name
Password: Password
* Credential: Sample Entry #2
Username: Michael321
Password: 12345
* Credential: Windows User
Username: cheese@outlook.com
Password: 123456
* Credential: Wi-Fi
Username: bathouse
Password: 654321
* Credential: Contact Email
Username: dev@ourcodeworld.com
Password: 123456
* Credential: Info Email
Username: info@ourcodeworld.com
Password: 123456789
* Credential: Bank Of America
Username: ourcodeworld
Password: 123456
以结构化方式打印信息(按组)
作为Keepass应用程序的常规用户, 我喜欢使用组和子组对存储在文件中的凭据进行分类。例如, 使用与工作相关的帐户将凭据与我的个人生活分开:
你可以以这种方式提取信息, 以及首先按组进行迭代, 然后在组内获取条目:
package com.ourcodeworld.mavensandbox;
// Import required class
import de.slackspace.openkeepass.KeePassDatabase;
import de.slackspace.openkeepass.domain.Entry;
import de.slackspace.openkeepass.domain.Group;
import de.slackspace.openkeepass.domain.KeePassFile;
import java.util.List;
public class Index {
public static void main(String[] args){
// 1. Open a KeePass database file through a plain text password
KeePassFile database = KeePassDatabase
.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
.openDatabase("12345");
// 2. Obtain the top groups in the database
List<Group> keePassGroups = database.getTopGroups();
// 3. Iterate over theme
for (Group group : keePassGroups) {
// 4. Print the name of the Group
System.out.println(" - " + group.getName());
// 5. List credentials inside this group
List<Entry> groupEntries = group.getEntries();
// 6. Print every credential inside the group
for (Entry entry : groupEntries) {
System.out.println(" * Credential: " + entry.getTitle());
System.out.println(" Username: " + entry.getUsername());
System.out.println(" Password: " + entry.getPassword());
}
}
}
}
此代码将在终端中生成以下输出:
- Windows
* Credential: Windows User
Username: cheese@outlook.com
Password: 123456
- Network
* Credential: Wi-Fi
Username: bathouse
Password: 654321
- eMail
* Credential: Contact Email
Username: dev@ourcodeworld.com
Password: 123456
* Credential: Info Email
Username: info@ourcodeworld.com
Password: 123456789
- Homebanking
* Credential: Bank Of America
Username: ourcodeworld
Password: 123456
- Recycle Bin
通过标题获得单个证书
由于没有通过ID或数字形式的索引, 因此从数据库中获取单个凭证的唯一方法是通过其标题, 例如:
package com.ourcodeworld.mavensandbox;
// Import required class
import de.slackspace.openkeepass.KeePassDatabase;
import de.slackspace.openkeepass.domain.Entry;
import de.slackspace.openkeepass.domain.KeePassFile;
import java.util.List;
public class Index {
public static void main(String[] args){
// 1. Open a KeePass database file through a plain text password
KeePassFile database = KeePassDatabase
.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
.openDatabase("12345");
// 2. Find single credential by title
Entry sampleEntry = database.getEntryByTitle("Sample Entry");
System.out.println("Title: " + sampleEntry.getTitle() + " Password: " + sampleEntry.getPassword());
}
}
这将在终端中打印:
Title: Sample Entry Password: Password
但是, 如果你拥有一个以上具有相同名称或包含相同字符串的凭证, 该怎么办?然后, 你将需要获取包含特定文本的条目, 并遍历结果以了解与搜索匹配的凭证:
package com.ourcodeworld.mavensandbox;
// Import required class
import de.slackspace.openkeepass.KeePassDatabase;
import de.slackspace.openkeepass.domain.Entry;
import de.slackspace.openkeepass.domain.KeePassFile;
import java.util.List;
public class Index {
public static void main(String[] args){
// 1. Open a KeePass database file through a plain text password
KeePassFile database = KeePassDatabase
.getInstance("C:\\Users\\sdkca\\Documents\\Database.kdbx")
.openDatabase("12345");
// 2. Search for all entries that contain 'Sample' in title
List<Entry> entriesByTitle = database.getEntriesByTitle("Sample", false);
for (Entry entry : entriesByTitle) {
System.out.println("Title: " + entry.getTitle() + " Password: " + entry.getPassword());
}
}
}
将改为打印:
Title: Sample Entry Password: Password
Title: Sample Entry #2 Password: 12345
编码愉快!
评论前必须登录!
注册