gpt4 book ai didi

tomcat - 如何避免为 tomcat 的 server.xml 数据源的资源定义明文存储密码?

转载 作者:行者123 更新时间:2023-11-28 21:43:49 34 4
gpt4 key购买 nike

tomcat 的 server.xml 中的资源定义看起来像这样......

<Resource
name="jdbc/tox"
scope="Shareable"
type="javax.sql.DataSource"
url="jdbc:oracle:thin:@yourDBserver.yourCompany.com:1521:yourDBsid"
driverClassName="oracle.jdbc.pool.OracleDataSource"
username="tox"
password="toxbaby"
maxIdle="3"
maxActive="10"
removeAbandoned="true"
removeAbandonedTimeout="60"
testOnBorrow="true"
validationQuery="select * from dual"
logAbandoned="true"
debug="99"/>

密码是明文的。如何避免这种情况?

最佳答案

如前所述,加密密码只是将问题转移到其他地方。

总之,这很简单。只需为您的 key 等编写一个包含静态字段的类,以及用于加密、解密密码的静态方法。使用此类在 Tomcat 的配置文件(server.xmlyourapp.xml...)中加密您的密码。

要在 Tomcat 中“即时”解密密码,请扩展 DBCP 的 BasicDataSourceFactory 并在您的资源中使用该工厂。

它看起来像:

    <Resource
name="jdbc/myDataSource"
auth="Container"
type="javax.sql.DataSource"
username="user"
password="encryptedpassword"
driverClassName="driverClass"
factory="mypackage.MyCustomBasicDataSourceFactory"
url="jdbc:blabla://..."/>

对于自定义工厂:

package mypackage;

....

public class MyCustomBasicDataSourceFactory extends org.apache.tomcat.dbcp.dbcp.BasicDataSourceFactory {

@Override
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable environment) throws Exception {
Object o = super.getObjectInstance(obj, name, nameCtx, environment);
if (o != null) {
BasicDataSource ds = (BasicDataSource) o;
if (ds.getPassword() != null && ds.getPassword().length() > 0) {
String pwd = MyPasswordUtilClass.unscramblePassword(ds.getPassword());
ds.setPassword(pwd);
}
return ds;
} else {
return null;
}
}

希望这对您有所帮助。

关于tomcat - 如何避免为 tomcat 的 server.xml 数据源的资源定义明文存储密码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/129160/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com