如何屏蔽xml文件中的敏感数据?

如何屏蔽xml文件中的敏感数据?,xml,groovy,Xml,Groovy,有一个敏感数据列表,我正试图在xml文件中屏蔽这些数据。它能够屏蔽这些列表数据,但在创建新的xml(屏蔽xml)时,从实际xml中“打包”xml标记内容不会像(屏蔽xml)中预期的那样写回,只会写回值,并且“打包”xml标记内的所有标记都会被写入 请帮助解决这里的问题,即使是一个地方的IP地址也没有被屏蔽 我在下面附上我的代码,它部分工作,并提供了两种xml内容 import groovy.xml.XmlUtil import java.util.regex.Pattern; public c

有一个敏感数据列表,我正试图在xml文件中屏蔽这些数据。它能够屏蔽这些列表数据,但在创建新的xml(屏蔽xml)时,从实际xml中“打包”xml标记内容不会像(屏蔽xml)中预期的那样写回,只会写回值,并且“打包”xml标记内的所有标记都会被写入

请帮助解决这里的问题,即使是一个地方的IP地址也没有被屏蔽

我在下面附上我的代码,它部分工作,并提供了两种xml内容

import groovy.xml.XmlUtil
import java.util.regex.Pattern;

public class SensitiveDatamasking { 
    private static String masked = "####"   
    def attributeList = ["username", "password","ipAddress"]    
    private static final String IPADDRESS_PATTERN = "(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";
    String removeSensetiveData(File file){
        removeSensetiveData(file.text)
    }       
    String removeSensetiveData(String xmlText){     
        def root = new XmlParser().parseText(xmlText);      
        nameValuePair(root)
        attributeValue(root)        
        nodeValue(root)     
        XmlUtil.serialize(root)
    }   
    private void nodeValue(def root) {      
        def elements = root."**".findAll{
            it.text().size() > 0 && it.children().size() == 1
        }       
        Pattern  pattern = Pattern.compile(IPADDRESS_PATTERN);      
        elements.each {             
            it.value =  it.text().replaceAll(pattern, masked)
        }
    }   
    private void nameValuePair(def root) {      
        def nodes = root."**".findAll{
             it?.@name?.toString()?.toLowerCase()?.contains("username" ) ||
             it?.@name?.toString()?.toLowerCase()?.contains( "password") ||
             it?.@name?.toString()?.toLowerCase()?.contains( "ipAddress") }     
        maskValue(nodes)
    }   
    private void attributeValue(def root) {     
        attributeList.each {
            maskAttribute( root, it)
        }
    }   
    private def maskAttribute(def root, String attribute) {
        def nodes =  root."**".findAll{ it."""@$attribute"""}
        maskAttributes( nodes, attribute)
    }

    private void maskValue(def nodes) {     
        nodes.each {  if (it.@value?.size() > 0) {
            it.@value = masked }
        }       
    }   
    private void maskAttributes(def nodes, String keyName) {
        nodes.each { it."""@$keyName""" = masked }
    }   
    static main(args) { 
        File file = new File("C:\\shared\\test\\zenderJan2019.xml")     
        SensitiveDatamasking xml = new SensitiveDatamasking()
        String maskedXml = xml.removeSensetiveData(file)        
        File output = new File("C:\\shared\\test\\zenderJan2019_masked.xml")
        output.write(maskedXml)
    }
}
实际xml(预期输出应与此xml内容匹配,用户名、密码和ipAddress的值只有隐藏的更改)


Linux
zion.zender.com
3.10.0-693.el7.x86_64
1.10.5测试版
1.1
2019年1月17日
2019年1月24日星期四14:28:52
正德尔
1.10.5测试版
1.10.5β-jag
屏蔽XML

<?xml version="1.0" encoding="UTF-8"?>
<org_dump date="1/25/19 8:17 AM" version="1.1">
  <DETAIL>
    <osname>Linux</osname>
    <hostname>zion.zender.com</hostname>
    <release>3.10.0-693.el7.x86_64</release>
  </DETAIL>
  <INFO>
    <version>1.10.5 beta</version>
    <Pack>1.1Jan 17, 2019Thu Jan 24 14:28:52 IST 2019zender1.10.5 beta1.10.5 beta jag</Pack>
    <MetaData>
      <Gateways>
        <Node port="14528" httpPort="14527" host="zion.zender.com" name="node01" ipAddress="####"/>
      </Gateways>
      <TeamGroup name="DomainTeams">
        <Team name="username" value="####"/>
        <Team name="password" value="####"/>
        <Team name="ipAddress" value="127.1.1.1"/>
      </TeamGroup>
      <Service name="Jag_Service" version="">
        <ServiceProcess>
          <Node name="node01"/>
          <PreStartCommand/>
          <PostStartCommand/>
          <JvmTeams/>
          <TeamGroup name="CUSTOM_PROPERTIES"/>
          <TeamGroup name="REPOSITORY">
            <Team name="LoggingDirectory" value=""/>
            <Team name="LogLevel" value="INFO"/>
            <Team name="ActivateDumpPersistenceConfigurationToFile" value="false"/>
            <Team name="ActivateLogPersistenceSQLToFile" value="false"/>
          </TeamGroup>
        </ServiceProcess>
        <TeamGroup name="CACHE">
          <Team name="EnableCache" value="false"/>
          <Team name="CacheJVMTeams" value="-Xmx128m"/>
        </TeamGroup>
      </Service>
    </MetaData>
  </INFO>
</org_dump>

Linux
zion.zender.com
3.10.0-693.el7.x86_64
1.10.5测试版
1.1 2019年1月17日至2019年1月24日14:28:52 IST 2019zender1.10.5 beta1.10.5 beta jag

您应该能够:

File file = new File("C:\\shared\\test\\zenderJan2019.xml")     
def xml = new XmlParser().parse(file)
xml.'**'.findAll { it.@name in ['username', 'password', 'ipAddress'] }*.@value = '####'
println XmlUtil.serialize(xml)

希望这有帮助,因为
节点
元素值中的属性
ipAddress
未被屏蔽,所以上述解决方案仅适用于名为“name”的属性,该属性与
['username'、'password'、'ipAddress']
中的任何属性匹配。是否需要添加
xml.**'.findAll{it.@ipAddress in['username'、'password'、'ipAddress']}*@value='######'
和所有其他xml元素属性的情况类似吗?谢谢,它是有效的,我想在这里提到的另一件事是,在这段代码中,如果源xml被缩小(没有空格或换行符),那么代码会漂亮地打印它,从而增加大小。在我的例子中,xml有时高达11mb。@Ricky用“缩小”的方式更新了它
File file = new File("C:\\shared\\test\\zenderJan2019.xml")     
def xml = new XmlParser().parse(file)
xml.'**'.findAll { it.@name in ['username', 'password', 'ipAddress'] }*.@value = '####'
println XmlUtil.serialize(xml)