代码之家  ›  专栏  ›  技术社区  ›  Ates Goral

在日志文件中隐藏敏感/机密信息

  •  10
  • Ates Goral  · 技术社区  · 17 年前

    如何隐藏敏感信息以避免进入日志文件?是的,您可以有意识地选择一开始不记录敏感的信息位,但在一般情况下,您可能会盲目地记录故障时的错误消息或在调查问题时跟踪消息等,最终导致敏感信息登录到日志文件中。

    例如,您可以尝试将包含客户信用卡号的订单记录插入数据库。当数据库出现故障时,您可能需要记录刚刚执行的SQL语句。然后您将在日志文件中得到客户的信用卡号。

    是否有一种设计范式可以用来“标记”某些敏感信息位,以便通用的日志管道可以过滤掉它们?

    7 回复  |  直到 10 年前
        1
  •  7
  •   paracycle    16 年前

    我目前的做法是把这些敏感信息记录下来。这使我们能够识别属于特定索赔的日志记录(例如特定的信用卡号码),但不赋予任何人仅获取日志并将敏感信息用于其邪恶目的的权力。

    当然,这样做总是需要良好的编码实践。我通常选择使用 toString 重载(在Java或.NET中)序列化用字段标记的字段的值的哈希值 Sensitive 应用于它们的属性。

    当然,SQL字符串的问题更大,但是我们更多地依赖于ORM来进行数据持久化,并记录系统在各个阶段的状态,然后记录SQL查询,因此它成为一个没有问题的问题。

        2
  •  5
  •   Fredrik Mörk    17 年前

    我个人会将日志文件本身视为敏感信息,并确保限制对它们的访问。

        3
  •  2
  •   erickson    17 年前

    记录信用卡号可能是PCI违规行为。如果您不符合PCI标准,您将收取更高的卡处理费用。要么不记录敏感信息,要么加密整个日志文件。

    你的“标记”敏感信息的想法很有趣。您可以为 Sensitive 包装真实的基础数据类型的信息。每当此对象呈现为字符串时,它只返回 "***" 或者什么。

    但是,这可能需要广泛的编码更改,并且需要一种类似于避免首先记录敏感信息所需的谨慎级别。

        4
  •  1
  •   Bob Kaufman    17 年前

    在您的示例中,您应该对信用卡号码进行加密,或者最好不要首先存储它。

    例如,如果您正在记录其他内容,例如登录,您可能需要显式地用****替换密码。

    然而,这样可以巧妙地避免回答你首先提出的问题。一般来说,在处理敏感信息时,应在将其加密到任何形式的永久存储(无论是数据库文件还是日志文件)的过程中对其进行加密。假设一个坏人能够得到他们的手,并相应地保护信息。

        5
  •  1
  •   Esteban Araya    17 年前

    如果您知道要过滤什么,可以在登录之前通过regex清理表达式运行日志输出。

        6
  •  1
  •   Adam Crume    17 年前

    特别是对于SQL语句,如果您的语言支持它,那么您应该使用参数,而不是在语句本身中放入值。换言之:

    select * from customers where credit_card = ?
    

    然后将参数设置为信用卡号。

    当然,如果您计划用填充了参数的SQL语句来记录,那么您将需要其他方法来过滤掉敏感数据。

        7
  •  0
  •   Senthil Arumugam SP    10 年前

    参考这个工具,它是为这个用例创建的。

    如果只想屏蔽所选字段,请在日志记录期间保持其他字段值不变。你可以试试这个。

    https://github.com/senthilaru/sp-util

    <dependency>
        <groupId>com.immibytes</groupId>
        <artifactId>sp-utils</artifactId>
        <version>1.0.0-RELEASE</version>
    </dependency>