/etc/passwd文件中存储的代码集是哪个?它可以是UTF-8吗?有哪些限制放置在用户命名上?

9
在现代的Unix或Linux系统中,你怎么知道/etc/passwd文件存储用户名称的编码方式?用户名称是否允许包含重音字符(比如ISO 8859-1或8859-15中0x80..0xFF范围内的字符)?/etc/passwd文件可以包含UTF-8吗?你能判断它是否包含UTF-8吗?在加密或散列之前,密码的明文是什么样子的?
显然,如果用户名和其他数据仅限于0x00..0x7F范围(并且无论如何都不包括0x00),那么UTF-8、8859-1或8859-15之间就没有区别;存在的字符都被相同地编码。
此外,我使用/etc/passwd作为类似于“基于Unix的机器上用户识别和认证数据库(有时称为目录服务),通常通过PAM访问,有时从本地机器以外的其他机器托管,但有时仍然是本地硬盘上的文件,传统上称为/etc/passwd,通常由/etc/shadow支持”的缩写。我还假设关于组数据库(通常是/etc/group文件)的等效问题具有相同的答案。
1个回答

4

所有的字符都是ASCII码。但密码本身从未被存储 - 只有单向哈希的结果。如果您想知道密码本身可以包含哪些字符,那就取决于语言环境,这将限制终端能够处理的字符。请参见“man locale”。

来自BSD man页面:

“/etc/passwd ASCII密码文件......”

至于用户名,我可以告诉你Solaris仅支持ASCII。我不能代表其他Unix系统发表意见。

“Solaris 2和Solaris 7中并非每个对象都可以由任意字符组成名称。以下对象的名称必须由ASCII字符组成:

* User names, group name, and passwords
* System name ...

"


你能提供证明(URL)来支持这个说法吗?如果非ASCII字节被输入到/etc/passwd文件中会发生什么? - Jonathan Leffler
1
感谢提供额外信息。假设您拥有一台机器,由来自美国(终端在8859-1)、德国(8859-15)和台湾(UTF-8)的人员访问。现在密码文件存储在哪个代码集中? - Jonathan Leffler
它仍然全部是ASCII。您可以键入的内容将随终端区域设置而异。但哈希函数的输出始终为ASCII。例如,您可以创建一个包含任何字符的文件,然后在其上运行md5 - 原始文件的字符集与生成的哈希的字符集无关。(传统上,passwd哈希是由crypt生成的,不是md5) - nont
好的 - 我知道哈希或加密的密码以纯ASCII存储; 这几乎是与我的主要问题无关的巧合 - 我想知道用户名存储在哪里?有什么限制? 'césar'和'jürgen'能够使用这些名称吗? - Jonathan Leffler
我找到了Solaris的答案。对于大多数Unix来说可能是相同的,但我不能确定。 - nont
Solaris 10中的'man -s 4 passwd'包括词语“[t]he password file is an ASCII file that ...”。因此,似乎您不应该与名字带口音的人合作。我不确定这是一个遗留文档缺陷还是实际限制。 - Jonathan Leffler

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