修剪密码,这样做是否不对?

4

我遇到了一个问题,即新记录的密码不是空白,而是一个空格。所以我首先想到的是在加载或保存密码时调用Trim()函数,这样就不会再有空格的问题了。但我想知道您是否认为这样做是错误的?


1
如果您删除用户故意输入的末尾空格,那么用户该如何知道自己的密码呢? - Jeroen Vannevel
2
用户的密码可能会在开头或结尾包含空格,因此无需修剪它,同时不要以明文形式存储密码。 - Habib
我投票支持重新开放。虽然原帖作者要求意见,但这个问题实际上是关于最佳实践的。 - user180326
6个回答

12

您不应该以明文方式存储密码。


2
更具体地说,使用带有合理工作量的PBKDF2、bcrypt或scrypt(带盐)进行加密,这样就不会遇到这样的“问题”。 - Kitsune
4
可以,但这并没有回答问题。 - user180326

3

这是错误的,因为您没有告知用户存储的密码与其输入的不同... 您可以使用String.IsNullOrWhiteSpace进行服务器端检查,并且如其他答案所述,不应该以明文形式存储密码


2

我建议您不要允许使用太短的密码。

此外,根据我的经验,用户输入密码时往往不会有意识地在密码前后添加空格。但是,如果您要求用户输入两次密码,那么用户不太可能不小心两次填写他们想要的密码(除非他们使用剪贴板粘贴)。然而,由于这也是一种常见做法,我总是修剪密码的前导/尾随空格 -- 内部空格应该保留。

补充

虽然其他人说修剪字符串是不好的,但我仍然认为他们是错的。如果您总是修剪并且始终填充,他们的密码将始终有效--他们不会知道存储的密码不是完全匹配的--当然,因为您永远不应该存储“密码”,只需要对结果进行单向哈希处理,所以真正的密码是无法知道的,只能知道它是否哈希到正确的哈希值。


1

正确的做法(至少是最佳实践之一)是尝试加密然后哈希密码。即使是最简单的密码,甚至是一个简单的空格,加密后也会生成一个非空格字符串。

以下是一个简单的代码:

public static string Hash(this string text)
{
    HashAlgorithm algorithm = algorithm = MD5.Create(); ;
    // Adding something (salt) to text to make it harder to guess
    text += "some-salt";
    //return algorithm.ComputeHash(text.ToBytes()).GetString().ToBase64();
    return Encoding.UTF8.GetString(algorithm.ComputeHash(Encoding.UTF8.GetBytes(text)));
}

在空格上调用此函数,结果为:

var result = " ".Hash();
// Xd�m���SJ�l|r�Z*

1

空格是密码中有效的字符。因此,您不应该去掉它。

此外,存储密码应该使用SecureString而不是'String'类。


谷歌确实会修剪密码... 不管这样做是否正确 - DarkWanderer
同意,但这不是一个广泛使用的标准。您不能依赖于空格不是密码字符。一些身份验证系统允许它,而另一些则不允许。https://dev59.com/-m035IYBdhLWcg3wW-la - Tilak

1
我建议您在密码验证中设置最小字符限制或验证,而不要修剪。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接