ecryptfs.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* Key derivation and passprhase wrapping
       [not found] <794484591.224591.1452104561446.JavaMail.zimbra@halfgaar.net>
@ 2016-01-18 10:27 ` Wiebe Cazemier
  2016-01-20  3:05   ` Tyler Hicks
  0 siblings, 1 reply; 5+ messages in thread
From: Wiebe Cazemier @ 2016-01-18 10:27 UTC (permalink / raw)
  To: ecryptfs

Hi, 

I was looking at the ecryptfs source code, and saw that the actual encryption key inserted into the kernel keyring is the *original* wrapped passphrase, SHA512'ed 65536 times. Why is a user-given passphrase encrypted as key, and not data from /dev/random? I unwrapped the passphrase on my Linux Mint system and saw it is actually a random string, so the Ubuntu/Mint installer took care of it for me. But why is that responsibility given to the user / outside world? One of the problems is that I can't change it. Had I made a ecryptfs archive myself and wrapped 'hello' as passphrase, that weak key will be used and cannot be changed by rewrapping.

Would it be possible/feasible to do something like:

* generate random encryption key A for insertion into kernel keyring.
* derive encryption key B from password with 'generate_passphrase_sig(...)' to encrypt key A.
* In v2 wrapped passphrase file, Octets 26-N1, store encrypted A, instead of encrypted passphrase.

Depending on how it's implemented, it could even be done completely backwards compatible (by ignoring the to-wrap passphrase).

Regards,

Wiebe

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Key derivation and passprhase wrapping
  2016-01-18 10:27 ` Key derivation and passprhase wrapping Wiebe Cazemier
@ 2016-01-20  3:05   ` Tyler Hicks
  2016-01-20 19:51     ` Wiebe Cazemier
  0 siblings, 1 reply; 5+ messages in thread
From: Tyler Hicks @ 2016-01-20  3:05 UTC (permalink / raw)
  To: Wiebe Cazemier; +Cc: ecryptfs

[-- Attachment #1: Type: text/plain, Size: 2378 bytes --]

On 2016-01-18 11:27:37, Wiebe Cazemier wrote:
> Hi, 
> 
> I was looking at the ecryptfs source code, and saw that the actual
> encryption key inserted into the kernel keyring is the *original*
> wrapped passphrase, SHA512'ed 65536 times. Why is a user-given
> passphrase encrypted as key, and not data from /dev/random?

This assumes that the mount.ecryptfs helper is used and not the
mount.ecryptfs_private helper.

mount.ecryptfs does key stretching (SHA512 * 65536) on a user-provided
passphrase and uses that as the file encryption key encryption key
(FEKEK). This keeps things simple so that the only thing a user needs to
access their encrypted files is the passphrase. There's no chance of
losing track of a file containing a wrapped FEKEK that is randomly
generated. However, mount.ecryptfs could be extended to make use of
wrapped, randomly generated FEKEK which would provide a more secure
option.

> I unwrapped the passphrase on my Linux Mint system and saw it is
> actually a random string, so the Ubuntu/Mint installer took care of it
> for me. But why is that responsibility given to the user / outside
> world?

All of the logic that set up that random FEKEK is in upstream
ecryptfs-utils. The confusion is probably caused by the unfortunate
split between the mount.ecryptfs and mount.ecryptfs_private helpers.

> One of the problems is that I can't change it. Had I made a
> ecryptfs archive myself and wrapped 'hello' as passphrase, that weak
> key will be used and cannot be changed by rewrapping.
> 
> Would it be possible/feasible to do something like:
> 
> * generate random encryption key A for insertion into kernel keyring.
> * derive encryption key B from password with 'generate_passphrase_sig(...)' to encrypt key A.
> * In v2 wrapped passphrase file, Octets 26-N1, store encrypted A, instead of encrypted passphrase.

I'm not following the intent here. You're wanting to change the FEKEK
that the Ubuntu/Mint installer generated?

Tyler

> 
> Depending on how it's implemented, it could even be done completely backwards compatible (by ignoring the to-wrap passphrase).
> 
> Regards,
> 
> Wiebe
> --
> To unsubscribe from this list: send the line "unsubscribe ecryptfs" in
> the body of a message to majordomo@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Key derivation and passprhase wrapping
  2016-01-20  3:05   ` Tyler Hicks
@ 2016-01-20 19:51     ` Wiebe Cazemier
  2016-01-20 20:03       ` Wiebe Cazemier
  0 siblings, 1 reply; 5+ messages in thread
From: Wiebe Cazemier @ 2016-01-20 19:51 UTC (permalink / raw)
  To: Tyler Hicks; +Cc: ecryptfs

----- Original Message -----
> From: "Tyler Hicks" <tyhicks@canonical.com>
> To: "Wiebe Cazemier" <wiebe@halfgaar.net>
> Cc: ecryptfs@vger.kernel.org
> Sent: Wednesday, 20 January, 2016 4:05:57 AM
> Subject: Re: Key derivation and passprhase wrapping
> 
> On 2016-01-18 11:27:37, Wiebe Cazemier wrote:
> > Hi,
> > 
> > I was looking at the ecryptfs source code, and saw that the actual
> > encryption key inserted into the kernel keyring is the *original*
> > wrapped passphrase, SHA512'ed 65536 times. Why is a user-given
> > passphrase encrypted as key, and not data from /dev/random?
> 
> This assumes that the mount.ecryptfs helper is used and not the
> mount.ecryptfs_private helper.
> 
> mount.ecryptfs does key stretching (SHA512 * 65536) on a user-provided
> passphrase and uses that as the file encryption key encryption key
> (FEKEK). This keeps things simple so that the only thing a user needs to
> access their encrypted files is the passphrase. There's no chance of
> losing track of a file containing a wrapped FEKEK that is randomly
> generated. However, mount.ecryptfs could be extended to make use of
> wrapped, randomly generated FEKEK which would provide a more secure
> option.
> 
> > I unwrapped the passphrase on my Linux Mint system and saw it is
> > actually a random string, so the Ubuntu/Mint installer took care of it
> > for me. But why is that responsibility given to the user / outside
> > world?
> 
> All of the logic that set up that random FEKEK is in upstream
> ecryptfs-utils. The confusion is probably caused by the unfortunate
> split between the mount.ecryptfs and mount.ecryptfs_private helpers.
> 
> > One of the problems is that I can't change it. Had I made a
> > ecryptfs archive myself and wrapped 'hello' as passphrase, that weak
> > key will be used and cannot be changed by rewrapping.
> > 
> > Would it be possible/feasible to do something like:
> > 
> > * generate random encryption key A for insertion into kernel keyring.
> > * derive encryption key B from password with 'generate_passphrase_sig(...)'
> > to encrypt key A.
> > * In v2 wrapped passphrase file, Octets 26-N1, store encrypted A, instead
> > of encrypted passphrase.
> 
> I'm not following the intent here. You're wanting to change the FEKEK
> that the Ubuntu/Mint installer generated?
> 
> Tyler
> 
> > 
> > Depending on how it's implemented, it could even be done completely
> > backwards compatible (by ignoring the to-wrap passphrase).
> > 
> > Regards,
> > 
> > Wiebe

I think I missed an important bit. I was looking at ecryptfs-wrap-passphrase, which makes you supply the FEK and FEKEK, but ecryptfs-setup-private actually already uses a random passphrase:

-m, --mountpass MOUNTPASS
    Passphrase for mounting the ecryptfs directory, default is 16 bytes from /dev/urandom if omitted

Never mind ;)

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Key derivation and passprhase wrapping
  2016-01-20 19:51     ` Wiebe Cazemier
@ 2016-01-20 20:03       ` Wiebe Cazemier
  2016-01-29 22:57         ` Tyler Hicks
  0 siblings, 1 reply; 5+ messages in thread
From: Wiebe Cazemier @ 2016-01-20 20:03 UTC (permalink / raw)
  To: Tyler Hicks; +Cc: ecryptfs

----- Original Message -----
> From: "Wiebe Cazemier" <wiebe@halfgaar.net>
> To: "Tyler Hicks" <tyhicks@canonical.com>
> Cc: ecryptfs@vger.kernel.org
> Sent: Wednesday, 20 January, 2016 8:51:43 PM
> Subject: Re: Key derivation and passprhase wrapping
> 
> I think I missed an important bit. I was looking at ecryptfs-wrap-passphrase,
> which makes you supply the FEK and FEKEK, but ecryptfs-setup-private
> actually already uses a random passphrase:
> 
> -m, --mountpass MOUNTPASS
>     Passphrase for mounting the ecryptfs directory, default is 16 bytes from
>     /dev/urandom if omitted
> 

I do see an issue though. The bash script says:

  random_data=`head -c 16000 /dev/urandom | od -x` || error_testing "$temp" "$(gettext 'Could not generate random data')"

But when urandom can't be read (doesn't exist, no file handles, whatever):

  random_data=`head -c 16000 /dev/urando | od -x` || echo "fail"
  head: cannot open ‘/dev/urando’ for reading: No such file or directory

Note, no 'fail' and $? == 0. And:

  echo $random_data
  0000000


Regards,

Wiebe

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: Key derivation and passprhase wrapping
  2016-01-20 20:03       ` Wiebe Cazemier
@ 2016-01-29 22:57         ` Tyler Hicks
  0 siblings, 0 replies; 5+ messages in thread
From: Tyler Hicks @ 2016-01-29 22:57 UTC (permalink / raw)
  To: Wiebe Cazemier; +Cc: ecryptfs

[-- Attachment #1: Type: text/plain, Size: 1313 bytes --]

On 2016-01-20 21:03:13, Wiebe Cazemier wrote:
> ----- Original Message -----
> > From: "Wiebe Cazemier" <wiebe@halfgaar.net>
> > To: "Tyler Hicks" <tyhicks@canonical.com>
> > Cc: ecryptfs@vger.kernel.org
> > Sent: Wednesday, 20 January, 2016 8:51:43 PM
> > Subject: Re: Key derivation and passprhase wrapping
> > 
> > I think I missed an important bit. I was looking at ecryptfs-wrap-passphrase,
> > which makes you supply the FEK and FEKEK, but ecryptfs-setup-private
> > actually already uses a random passphrase:
> > 
> > -m, --mountpass MOUNTPASS
> >     Passphrase for mounting the ecryptfs directory, default is 16 bytes from
> >     /dev/urandom if omitted
> > 
> 
> I do see an issue though. The bash script says:
> 
>   random_data=`head -c 16000 /dev/urandom | od -x` || error_testing "$temp" "$(gettext 'Could not generate random data')"
> 
> But when urandom can't be read (doesn't exist, no file handles, whatever):
> 
>   random_data=`head -c 16000 /dev/urando | od -x` || echo "fail"
>   head: cannot open ‘/dev/urando’ for reading: No such file or directory
> 
> Note, no 'fail' and $? == 0. And:
> 
>   echo $random_data
>   0000000

For completeness, we should mention that this is being tracked in
Launchpad:

 https://launchpad.net/bugs/1539553

Tyler

[-- Attachment #2: Digital signature --]
[-- Type: application/pgp-signature, Size: 819 bytes --]

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2016-01-29 22:57 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
     [not found] <794484591.224591.1452104561446.JavaMail.zimbra@halfgaar.net>
2016-01-18 10:27 ` Key derivation and passprhase wrapping Wiebe Cazemier
2016-01-20  3:05   ` Tyler Hicks
2016-01-20 19:51     ` Wiebe Cazemier
2016-01-20 20:03       ` Wiebe Cazemier
2016-01-29 22:57         ` Tyler Hicks

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).