eCryptfs允许的最大文件名(和文件夹)大小是多少?


44

我是eCryptfs的新用户,但有一个非常基本的问题,我找不到任何地方。我对通过使用Linux的Synology NAS使用eCryptfs感兴趣。

尝试通过Synology的加密应用程序(eCryptfs)加密我的文件夹(EXT4)时,遇到错误,指出我的文件名长度不能超过45个字符(因此,没有加密)。

如果限制的确是45个字符,则eCryptfs对于大多数人可能不是可用的工具。

使用eCryptfs加密文件和文件夹时,允许的最大文件名大小是多少?是255个字符吗?


6
我不喜欢ecryptfs加密文件名的方式是荒谬的。首先,它在前缀固定字符串“ ECRYPTFS_FNEK_ENCRYPTED”之前提供了20多个字节。到每个文件名。然后,它会以过多的随机字节作为前缀,使相同的名称看起来有所不同。EncFS以一种更加有效的方式来执行此操作。

Answers:


70

全面披露:我是eCryptfs用户空间实用程序的作者之一和当前维护者。

好问题!

对于大多数文件系统(包括EXT4),Linux的最大文件名长度为255个字符,最大路径为4096个字符。

eCryptfs是一个分层文件系统。它堆叠在另一个文件系统(例如EXT4)的顶部,该文件系统实际上是用于将数据写入磁盘的。eCryptfs始终加密文件内容,但是可以选择加密(模糊)文件名(或不加密)。

如果文件名未加密,则可以安全地写入最多255个字符的文件名并对其内容进行加密,因为写入较低文件系统的文件名将完全匹配。虽然攻击者无法读取index.html或的内容budget.xls,但他们将知道存在哪些文件名。根据您的用例,这可能会(或可能不会)泄漏敏感信息。

如果文件名被加密,事情会变得更加复杂。eCryptfs在加密文件名的前面添加了一些数据,以便它可以确定识别加密文件名。同样,加密本身涉及“填充”文件名。

例如,我有一个加密文件~/.bashrc。该文件名使用我的密钥加密:

/home/kirkland/.Private/ECRYPTFS_FNEK_ENCRYPTED.dWek2i3.WxXtwxzQdkM23hiYK757lNI7Ydf0xqZ1LpDovrdnruDb1-5l67.EU--

显然,这7个字符的文件名现在需要加密7个以上的字符。根据经验,我们发现超过143个字符的字符文件名开始需要> 255个字符进行加密。因此,我们(作为eCryptfs上游开发人员)通常建议您将文件名限制为〜140个字符。

综上所述,Synology NAS是一种商业产品,嵌入并使用eCryptfs和Linux来加密和保护设备上的数据。我们(eCryptfs的上游开发人员)与Synology或其产品无关,尽管我们通常很高兴看到野外使用eCryptfs 。在我看来,他们对45个字符的推荐要么是印刷错误(来自我们140个字符的推荐),要么仅仅是一个更为保守的估计。


我非常希望看到,FUSE覆盖文件系统可以解决自己的“文件名太长”问题,并且仅以1:1代理与底层文件系统一起工作。这样的FUSE fs对于不同的文件系统(ecryptfs,EncFS)将很有用,而对于当前支持的文件名将保持不变。再次,将是可选的。-我的愿望:unix.stackexchange.com/q/283​​149/9689
Grzegorz Wierzowiecki

17
这个答案并不完全正确。文件名的最大大小为255字节或C / C ++字符类型。但是文件名中的最大字符有所不同。当使用大多数系统默认的UTF-8时,如果使用UTF-16、63-127,则文件名可以在63-255个字符(又称为代码点)之间。重要的是要注意,1个字符可以是存储空间中的一个或多个字节,并取决于系统用户使用的代码集。
拉利

对开发人员的建议:将加密的名称跨最终用户隐藏的子目录拆分,以获取必要的长度,如果外部文件系统需要,甚至可能超过linux最大名称长度限制。单个文件或目录变为“ ENCRYPTFS-01-OF-04 [.....] / ENCRYPTFS-02-OF-04 [.....] / ENCRYPTFS-03-OF-04 [..... ] / ENCRYPTFS-04-OF-04 [.....]“-Linux btrfs,ext1-4和其他文件没有最大定义的目录深度,因此文件系统可以处理跨多个未公开子目录的扩展文件名和目录名。
Dale Mahalko '16

1
我的建议是将要存储的所有元数据存储在xattrs中,而不是文件名中。:|
Trejkaz

1
您说eCryptfs“可以选择加密(模糊)文件名(或不加密)”。如何禁用文件加密,以便可以取回完整的255个字符的文件名,而不是限制为143个字符?我相信,我安装eCryptfs的方法是在Ubuntu安装过程中选中此复选框或“加密主目录”中的任何内容。
加布里埃尔·斯台普斯

11

这个线程非常有趣,因为我想知道完全相同的事情。如果文件名必须小于或等于140个字符,那么我可以重命名500000个文件中的20个文件,但是(在我的情况下)不超过45个字符是不可行的,因为这将需要我重命名太多的文件。

我直接向Synology提出了完全相同的问题(甚至指向他们指向本文),他们的回答很有趣:“加密共享的文件名限制为143个字节。最大可以是140个纯拉丁字符或45个CJK(中文) ,日文和韩文)字符。”

遵循此答案,我对自己进行了更多测试,使用45、46、140、143和144个字符的文件进行了测试。我的测试表明,最多143个字符的文件(不是字节,与Synology告诉我的相反)将被加密,但是144个字符的文件将防止文件夹被加密。但是,我从NAS收到的错误消息是文件名必须少于45个字符(而现实情况是文件名应少于144个字符)。

我没有使用CJK字符进行测试...但是,对于阅读本文的任何人来说,尽管系统告诉了您,但直到143个字符似乎还不错。


7

我想澄清一下,Linux每个文件名的限制为255个字节,而不是255个字符。这是一个很大的差异,如果使用例如UTF-8编码,则最终文件名最多为100个字符。


1
如果每个字符使用每个代码点4个字节的最大编码,则最大值为63。对于任何UTF模式(UTF-16和UTF-32)都是相同的
Rahly

@Rahly那最终可能会改变。在减少最大有效Unicode代码点U+10FFFF以满足UCS-2(基本上没有代理对的UTF-16)的限制之前,UTF-8可能需要多达6个字节来表示32位代码点,因为它的编码方式“字符的开始”和“字符的继续”,以确保无论在字节流中从何处开始解析,都可以重新获取解析器同步。他们最终有可能最终决定撤销该决定,因为他们用尽了未分配的代码点。
ssokolow

1
但是极不可能的,除非他们开始添加疯狂的角色。从U8.0开始,仅分配了120k。他们在此迭代中添加了约8k个字符。如果他们坚持下去,则需要在〜106版本上进行扩展。
Rahly

而且我认为他们也必须首先终止Windows JavaScript,因为它们都依赖于UTF-16。(不过,在JavaScript的情况下,可能有可能对此进行纠正吗?)
SamB

1

ecrypt的文件名长度对我来说只是一个问题,因为我需要主目录中的特定子树来支持长文件名,最终我意识到我可以简单地在文件内创建文件系统并将其挂载:

dd if=/dev/zero of=/home/me/.some.img bs=1024 count=1024
mkfs.ext3 /home/me/.some.img
chmod 777 /home/me/longfilenames
sudo mount /home/me/.some.img /home/me/longfilenames

可能存在各种效率问题,但对于我的情况来说,这只是文件的测试结果,这些结果是出于我自己的本地目的而定期创建的,这已经足够了。

我的同事将他们的图像放在/ tmp中-测试数据不是特别机密:我们主要是要保护我们的源代码,而不是测试结果。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.