密码应该比较文化特定还是二进制相等?

Should passwords be compared culture specific or binary equal?

众所周知,在 unicode 中比较字符串有不同的方法。其中之一是特定于文化的。这在 .Net 中也是一个很好的主题。

我目前处于必须比较两个密码是否相等的位置。 (不,不要与商店进行比较 - 这当然是经过腌制和散列处理的!)所以这是用于更改密码对话框。

这里的问题:它应该是文化特定的还是不可知的(例如在 C# string.Compare() (==) 或 string.CompareOrdinal() 中?

有什么影响?

显然哈希与文化无关(至少在 .Net 中)?

它应该与将要针对散列版本测试的相等性相匹配。

基本上,想象一下其中一个密码已被存储,而您正尝试使用另一个密码登录 - 它会起作用吗?这肯定是您要测试的内容。

我个人很想用您在其他地方使用的完全相同的代码简单地对它们进行哈希处理,然后比较结果 - 这样您就可以保证与您真正关心的内容一致。

您指定了更改密码对话框,所以我会解决这个问题。

因为他们在更改密码对话框中输入密码的唯一目的是用足够多轮的 BCrypt、SCrypt 或 PBKDF2 对该密码进行加盐和哈希处理,并且因为所有这三个都使用在字节或字节集(即它们对 1 和 0 起作用),那么密码只有在它们的位相同时才相同。

因此,您必须使用二元相等。

从更实际的角度来看,由于他们只是连续输入两次,您应该期望并强制要求他们每次都以完全相同的方式输入!

是的,散列与文化无关,因为散列对位和字节进行操作,而不是对符号或含义甚至字符本身进行操作。