Security 最有可能从日志文件中删除的密钥列表?

Security 最有可能从日志文件中删除的密钥列表?,security,logging,Security,Logging,最近,我注意到一些敏感数据正在写入我正在开发的应用程序的日志文件中。我查看了一下,我们的应用程序有一个密钥列表,在写出来之前它会从我们的日志中删除这些密钥,但我觉得这个列表可以扩展 是否有找到时应从日志文件中删除的公用密钥列表? 例如,以下密钥及其变体可能永远不会记录在日志文件中的任何位置 access_token auth_token client_id client_secret oauthSecret oauthToken password refresh_token connection

最近,我注意到一些敏感数据正在写入我正在开发的应用程序的日志文件中。我查看了一下,我们的应用程序有一个密钥列表,在写出来之前它会从我们的日志中删除这些密钥,但我觉得这个列表可以扩展

是否有找到时应从日志文件中删除的公用密钥列表?

例如,以下密钥及其变体可能永远不会记录在日志文件中的任何位置

access_token
auth_token
client_id
client_secret
oauthSecret
oauthToken
password
refresh_token
connection_string

请注意,我已经看到了,但它似乎没有任何细节,只是概括了一下。

到目前为止,我能想到的最好的结果是以下内容,我通过在谷歌搜索“密文密码令牌”找到了我最好的结果

编辑名称中任意位置包含以下内容的键
  • 请记住,键可以通过以下任何方式显示:
    x=y,x:y,'x':y,“x”:y
  • 代币
  • 秘密
  • 密码
  • 会议
  • 联系
  • jwt
考虑删除所有用户名的变化,例如:
  • 用户名
  • 用户名
  • 使用者
  • 电子邮件
  • 凭证
编辑看起来像
  • 信用卡号码
  • 社会保险号码
  • 可能是电子邮件地址
详细说明用于编校某些数据值(而非键)的正则表达式: 信用卡号(带分隔符)
\d{4}[^\w]\d{4}[^\w]\d{4}[^\w]\d{4}

社会保险号码(带分隔符)\d{3}[^\w]\d{2}[^\w]\d{4}

电子邮件地址\b([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9-。]\ [A-Za-z0-9])@([A-Za-z0-9]|[A-Za-z]\[A-Za-z0-9-][A-Za-z0-9])+([A-Za-z0-9]\ |[A-Za-z0-9][A-Za-z0-9-]*[A-Za-z0-9])\b

主机名\b(([A-Za-z]|[A-Za-z][A-Za-z0-9-]\ [A-Za-z0-9])+([A-Za-z0-9]\|[A-Za-z0-9][A-Za-z0-9-][A-Za-z0-9])\b

用于编校数据的节点模块

注意:我的一位同事非常出色地为我提供了一个java键值编校的java示例,使用正则表达式消除了xml和json中包含“session、secret、token、password、passwd、connection”的键值,以及引用的变体

import java.security.GeneralSecurityException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Redact {
  private static final String prefix = "[\"']?(session|(auth_)?token|password|passwd|secret|connection)[\"']?";
  private static final String capture = "([\"']?)([\\w\\d!#$%()*+,-./:<=>?@[\\\\]^_`{|}~]+)([\"']?)";
  private static Pattern pattern = Pattern.compile(prefix + "\\s*(=|:)\\s*" + capture, Pattern.CASE_INSENSITIVE);

  public static String encryptSensitiveInfo(String message) {
    try {
      if (message == null) 
        return message;

      StringBuffer newStr = new StringBuffer(message);
      int lenDiff = 0;
      Matcher m = pattern.matcher(message);

      // Loop over message until all sensitive data is redacted
      while (m.find()) {
        String keyAndValue = m.group(0);
        String value = m.group(5);
        String REDACTED = "REDACTED";
        String replacementText = keyAndValue.replace(value, REDACTED);

        // Replace the key/value in the message with the new redacted
        // value, adjusting for where it is in the redacted version of
        // the input
        newStr = newStr.replace(m.start() - lenDiff, m.end() - lenDiff, replacementText);
        lenDiff += keyAndValue.length() - replacementText.length();
      }
      return newStr.toString();
    } catch (Exception e) {
      return message;
    }
  }
}
导入java.security.GeneralSecurityException;
导入java.util.regex.Matcher;
导入java.util.regex.Pattern;
公共类修订{
私有静态最终字符串前缀=“[\”]?(会话|(身份验证)?令牌|密码|密码|秘密|连接)[\”];
私有静态最终字符串捕获=“([\”')?)([\\w\\d!\$%()*+,-./:?@[\\\]^{\\\}~]+)([\“']?);
私有静态模式Pattern=Pattern.compile(前缀+“\\s*(=|:)\\s*”+捕获,模式。不区分大小写);
公共静态字符串EncryptSensiveInfo(字符串消息){
试一试{
如果(消息==null)
返回消息;
StringBuffer newStr=新的StringBuffer(消息);
int-lenDiff=0;
匹配器m=模式匹配器(消息);
//循环消息,直到所有敏感数据都被编辑
while(m.find()){
字符串keyAndValue=m.group(0);
字符串值=m.group(5);
字符串REDACTED=“REDACTED”;
字符串替换text=keyAndValue.replace(值,已编辑);
//将消息中的键/值替换为新编辑的
//值,根据其在的修订版本中的位置进行调整
//输入
newStr=newStr.replace(m.start()-lenDiff,m.end()-lenDiff,replacementText);
lenDiff+=keyAndValue.length()-replacementText.length();
}
return newStr.toString();
}捕获(例外e){
返回消息;
}
}
}

非常好的列表。在我们公司,我们(用随机数
*
)屏蔽了所有包含
密码
秘密
令牌
的内容,这是一个很好的观点。。。。我们正在围绕上述值执行正则表达式,但将其简化为包含这些值的子字符串的键可能是最好的。在与人们讨论这一点时,我们想到的一件事是,我们的目标是值,比如
X=1
,和
X:1
,以及它的引用变量,但我们的目标不是XML值,比如
1
,而是它的价值。嗯,好吧,我们没有任何关于值和引用变量的东西,但我们会关注XML节点,因为它们包含大量丰富的配置数据(例如连接令牌)。在XML节点序列化步骤中,我们查找非常特定的标记并屏蔽内容。