【问题标题】:Mask passwords in String掩码字符串中的密码
【发布时间】:2013-08-29 20:10:01
【问题描述】:

我一直想知道一些关于字符串函数的问题,例如 replace()。

我的目标很简单。我有一个记录器,它将字符串记录到一个文本文件中,其中包含在将其写入日志文件之前需要屏蔽的密码。

例如:

str = "-field_value=userId=1,-field_value=password=pass123,-field_value=location=London,-field_value=day=Tuesday,-field_value=emailPassword=pass123,-field_value=fbPassword=pass1234";

在这种情况下,哪种方法最好?该字符串可能以也可能不以任何密码结尾“field_value”。

我需要在这个字符串中用它们的确切长度屏蔽所有出现的“密码”以获得以下输出:

str = "-field_value=userId=1,-field_value=password=*******,-field_value=location=London,-field_value=day=Tuesday,-field_value=emailPassword=*******,-field_value=fbPassword=********";

哪个更适合使用?普通字符串处理(使用 substrings/replaceAll/indexOf)或 StringBuilder 函数?

另外,在这种情况下使用正则表达式的效果如何?我从来没有广泛使用过正则表达式,所以我对在这种情况下使用它没有什么想法。

【问题讨论】:

  • 我目前正在为这个用例使用 Java。虽然 C# 中的解决方案也会非常有帮助。

标签: regex string replace substring masking


【解决方案1】:

我假设这是 C#,但这个答案对许多其他语言有效。

您不能使用明文形式的密码。就在你这样做。所以这是一个巨大的安全问题,如果你输入“*”而不是密码也没关系。它存在于内存中,从内存中提取密码需要很少的技能(假设攻击者可以访问机器)。

一个标准的方法是你只存储密码哈希和盐。现在的问题是如何将密码转换为哈希以及如何安全地处理原始密码。为此,您应该使用SecureString,它会加密内存中的密码字符串,并在不再需要时将其安全地从内存中删除。

直接回答您的问题:您不使用任何方法将密码字符替换为星号。在这种情况下,任何方法都是不安全的。

【讨论】:

    【解决方案2】:

    我使用String.replaceAll(regex, replace) 方法搜索password 或emailPassword 等并进行了屏蔽。不确定,这是否是在这种情况下进行屏蔽的最理想方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-19
      • 1970-01-01
      • 2017-11-04
      • 2015-02-23
      • 2020-07-08
      • 2012-12-12
      • 1970-01-01
      • 2011-10-10
      相关资源
      最近更新 更多