我有一个连接到数据库的java应用程序。
数据库的用户名和密码存储在属性文件中。
避免在属性文件中以明文形式存储密码同时仍然保留让用户更改它的选项的常见做法是什么?
这里的主要动机是防止有人在管理员编辑属性文件时越过管理员的肩膀看到密码。
我在这里读到,有一个内置的方法可以在C#中做到这一点。
了解java,我不期望找到一个内置的解决方案,但我想听听其他人在做什么。
如果我找不到任何好的选择,那么我可能会用一个将保存在代码中的恒定密码对其进行加密。但我讨厌这样做,因为感觉不对。
编辑2012年12月12日看起来没有魔法,我必须在代码或类似的东西中存储密码。最后,我们实现了一些与答案之一中提到的Jasypt非常相似的功能。所以我接受Jasypt的答案,因为它是最接近确定答案的东西。
提供一个定制的N因子认证机制怎么样?
在组合可用方法之前,假设我们可以执行以下操作:
1)Java程序内的硬代码
2) 储存在一个。属性文件
3) 要求用户从命令行键入密码
4) 要求用户从表单中键入密码
5) 要求用户从命令行或表单加载密码文件
6) 通过网络提供密码
7) 许多备选方案(例如绘制秘密、指纹、特定于IP的、bla bla bla bla)
第一种选择:我们可以通过使用模糊处理使攻击者的情况更加复杂,但这并不是一个好的对策。如果一个好的程序员能够访问文件,他/她就可以很容易地理解它是如何工作的。我们甚至可以导出每个用户的二进制文件(或者只是模糊部分或关键部分),因此攻击者必须能够访问此用户特定的文件,而不是另一个发行版。同样,我们应该找到一种更改密码的方法,例如通过重新编译或使用反射来动态更改类行为。
第二种选择:我们可以将密码存储在中。属性文件采用加密格式,因此攻击者无法直接看到它(就像jasypt一样)。如果我们需要一个密码管理器,我们也需要一个主密码,它应该再次存储在某个地方-在一个。类文件、密钥库、内核、另一个文件甚至内存中——都有其优缺点<但是,现在用户只需编辑。密码更改的属性文件。
第三个选项:从命令行运行时键入密码,例如java-jar/myprogram。jar-p sdflhjkiweHIUHIU8976hyd。
这不需要存储密码,密码将保留在内存中。但是,历史
命令和操作系统日志可能是您最大的敌人。要即时更改密码,您需要实现一些方法(例如监听控制台输入、RMI、套接字、REST bla bla),但密码将始终保留在内存中。
只有在需要的时候才能暂时解密-
第四个选项:从自定义表单而不是命令行提供密码。这将避免伐木暴露的问题。
第五种选择:提供一个文件作为之前存储在另一种媒体上的密码-
第六个选项:同样为了避免肩冲浪,可以实现RMI方法调用,从另一台设备(例如通过手机)提供密码(通过加密通道)。但是,您现在需要保护您的网络通道和对另一台设备的访问。
我会选择上述方法的组合来实现最大的安全性,这样就必须访问。类文件、属性文件、日志、网络频道、肩上冲浪、中间人、其他文件等等。这可以使用所有sub_密码之间的异或操作轻松实现,以生成实际密码。
然而,我们无法防止未经授权的内存访问,这只能通过使用一些访问受限的硬件(例如智能卡、HSM、SGX)来实现,在这些硬件中,所有内容都被计算在内,没有任何人,甚至合法所有者能够访问解密密钥或算法。同样,人们也可以窃取这些硬件,有报道称的侧信道攻击可能有助于攻击者提取密钥,在某些情况下,您需要信任另一方(例如,使用SGX,您信任英特尔)。当然,当安全飞地克隆(反组装)成为可能时,情况可能会恶化,但我想这需要几年才能实现。
此外,可以考虑密钥共享解决方案,其中完整密钥在不同服务器之间拆分。但是,在重建时,完整密钥可能会被盗。缓解上述问题的唯一方法是安全的多方计算。
我们应该始终记住,无论输入方法如何,我们都需要确保不易受到网络嗅探(MITM攻击)和/或密钥记录器的攻击。
穷人的折衷解决方案是使用简单的多重签名方法。
例如,DBA将应用程序数据库密码设置为50个字符的随机字符串。TAKqWskc4ncvKaJTyDcgAHq82X7tX6GfK2fc386bmNw3muknjU
他或她将一半的密码给应用程序开发人员,然后由他们将其硬编码为java二进制文件。
私有字符串pass1="TAKqWskc4ncvKaJTyDcgAHq82"
密码的另一半作为命令行参数传递。DBA将pass2提供给系统支持或管理员,他们要么输入应用程序启动时间,要么将其放入自动应用程序启动脚本。
java-jar/myapplication.jar-pass2 X7tX6GfK2fc386bmNw3muknjU
当应用程序启动时,它使用pass1 pass2并连接到数据库。
这种解决方案有许多优点,没有提到的缺点。
您可以放心地将一半密码放在命令行参数中,因为除非您是拥有另一半密码的开发人员,否则阅读它不会有多大帮助。
DBA还可以更改密码的后半部分,开发人员无需重新部署应用程序。
在阅读源代码时,源代码也可以是半公开的,并且密码不会授予您应用程序访问权限。
您可以通过对数据库将接受连接的IP地址范围添加限制来进一步改善这种情况。
Jasypt提供组织。jasypt。属性。EncryptableProperties类,用于加载、管理和透明解密中的加密值。属性文件,允许在同一文件中混合加密值和未加密值。
http://www.jasypt.org/encrypting-configuration.html
通过使用组织。jasypt。属性。EncryptableProperties对象,应用程序将能够正确读取和使用。属性文件如下:
datasource.driver=com.mysql.jdbc.Driver
datasource.url=jdbc:mysql://localhost/reportsdb
datasource.username=reportsUser
datasource.password=ENC(G6N718UuyPE5bHyWKyuLQSm02auQPUtm)
请注意,数据库密码是加密的(事实上,任何其他属性也可以加密,无论是否与数据库配置相关)。
我们如何读取这个值?像这样:
/*
* First, create (or ask some other component for) the adequate encryptor for
* decrypting the values in our .properties file.
*/
StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor();
encryptor.setPassword("jasypt"); // could be got from web, env variable...
/*
* Create our EncryptableProperties object and load it the usual way.
*/
Properties props = new EncryptableProperties(encryptor);
props.load(new FileInputStream("/path/to/my/configuration.properties"));
/*
* To get a non-encrypted value, we just get it with getProperty...
*/
String datasourceUsername = props.getProperty("datasource.username");
/*
* ...and to get an encrypted value, we do exactly the same. Decryption will
* be transparently performed behind the scenes.
*/
String datasourcePassword = props.getProperty("datasource.password");
// From now on, datasourcePassword equals "reports_passwd"...
问题内容: 我有一个受密码保护的Excel电子表格。我需要打开此电子表格并从中读取数据。我一直在尝试使用POI API无济于事。首选Java解决方案,但任何想法都会有所帮助。 编辑:是的,我有密码。该文件在excel中受密码保护;必须输入密码才能查看电子表格。 Edit2:我无法使用带有密码的POI打开它,我在寻找替代解决方案。 问题答案: 您可以使用JExcelApi。 自从我这样做已经有一段时
问题内容: 我已经使用Java创建了zip文件,如下所示 现在,我想在单击zip文件时提示我输入密码,然后解压缩zip文件。请任何帮助,我应该怎么走? 问题答案: 尝试以下基于以下代码Zip4j: 来自。 用法示例:
到目前为止,我一直在创建一个文件(txt/excel),使用buffered Writer创建文本文件,使用JExcel API创建excel文件。这些文件是我只用Java创建的。 现在我想让文件密码在这两种情况下都受到保护,比如,文件可以被很多人访问,但只有选中的人可以使用自己的登录ID/密码访问它。 有可能吗?。。 谢谢
protection([string $password]); 示例一 $config = ['path' => './tests']; $fileObject = new \Vtiful\Kernel\Excel($config); $fileObject = $fileObject->fileName('tutorial.xlsx'); $filePath = $fileObject
问题内容: 我想使pdf文件受密码保护。我只是对它进行了搜索,并在下面找到了一个好的解决方案。它工作正常,但是使用下面给定的代码保护pdf后,它会清除pdf中已经存在的所有数据。 此代码使用的jar文件是: itextpdf-5.2.1.jar bcmail-jdk16-1.46.jar bcprov-jdk16-1.46.jar bctsp-jdk16-1.46.jar 保护PDF的代码: 我需