• # Ma version

    Posté par . En réponse au journal un vrai coffre fort numérique. Évalué à 10.

    Sans aucunement critiquer la méthode présentée dans le journal, je me permets de présenter ma propre solution.

    Elle est basée sur GnuPG (pour le chiffrement) et udisksctl (pour la manipulation de volumes, en gros la même chose que ce pour quoi est utilisé losetup dans le journal, mais sans avoir besoin de sudo).

    J’utilise GnuPG plutôt que cryptsetup pour pouvoir « ouvrir le coffre » avec ma carte OpenPGP.

    Sans fioritures, le code complet :

    #!/bin/bash
    # vault - Manages encrypted archives
    # Copyright (C) 2014,2015 Damien Goutte-Gattat
    # 
    # Copying and distribution of this file, with or without modification,
    # are permitted in any medium without royalty provided the copyright
    # notice and this notice are preserved.
    encrypted_vault_dir=${XDG_DATA_HOME:-$HOME/.local/share}/vaults
    decrypted_vault_dir=$XDG_RUNTIME_DIR/vaults
    default_size=8
    die()
    {
     echo "${0##*/}: $@" >&2
     exit
    }
    usage()
    {
     cat <<EOU
    Usage:
     [1] vault new <name> [size]
     Create a new vault with the specified name and size (in Mb).
     If size is not specified, default is ${default_size}Mb.
     [2] vault open <name>
     Open the specified vault.
     [3] vault close <name>
     Close the specified vault.
     [4] vault dclose [name]
     Close the specified vault without saving changes.
     If no vault is specified, all currently opened vaults
     are closed.
     [5] vault is-open [name]
     Return 0 if the specified vault is open, 1 otherwise.
     A default vault name may be specified in the DEFAULT_VAULT
     environment variable.
    EOU
     exit 0
    }
    open_vault()
    {
     local encrypted_vault=$encrypted_vault_dir/1ドル.gpg
     local decrypted_vault=$decrypted_vault_dir/1ドル.img
     [ -f $decrypted_vault ] && die "Vault 1ドル is already opened"
     [ -f $encrypted_vault ] || die "Cannot found vault 1ドル"
     if ! gpg2 -o $decrypted_vault -d $encrypted_vault ; then
     rm -f $decrypted_vault
     die "Cannot decrypt vault 1ドル"
     fi
     loop_device=$(udisksctl loop-setup --file $decrypted_vault | sed -nre 's,Mapped file .+ as (.+)\.,1,円p')
     udisksctl mount --block-device $loop_device --options fmask=0177
    }
    close_vault()
    {
     local encrypted_vault=$encrypted_vault_dir/1ドル.gpg
     local decrypted_vault=$decrypted_vault_dir/1ドル.img
     [ -f $decrypted_vault ] || die "Vault 1ドル is not opened"
     volume_name=$(echo 1ドル | tr a-z A-Z)
     loop_device=$(mount | grep /run/media/$USER/$volume_name | cut -d' ' -f1)
     udisksctl unmount --block-device $loop_device
     udisksctl loop-delete --block-device $loop_device
     if [ "x2ドル" = x1 ]; then
     gpg2 -o $encrypted_vault.$$ -e $decrypted_vault \
     && mv $encrypted_vault.$$ $encrypted_vault
     fi
     rm $decrypted_vault
    }
    close_all_vault()
    {
     ls $decrypted_vault_dir/*.img 2>/dev/null | while read vault ; do
     vault=${vault##*/}
     close_vault ${vault%.img} 0
     done
    }
    new_vault()
    {
     dd if=/dev/zero of=1ドル.img bs=1M count=2ドル
     /sbin/mkfs.vfat -n $(echo 1ドル | tr a-z A-Z) 1ドル.img
     gpg2 -o $encrypted_vault_dir/1ドル.gpg -e 1ドル.img
     rm 1ドル.img
    }
    [ -d $encrypted_vault_dir ] || mkdir -p $encrypted_vault_dir
    [ -d $decrypted_vault_dir ] || mkdir -p $decrypted_vault_dir
    case "1ドル" in
    -h|--help|"")
     usage
     ;;
    -v|--version)
     sed -n '2,/^$/ s/^# //p' 0ドル
     exit 0
     ;;
    new)
     [ -n "2ドル" ] || die "Missing vault name"
     new_vault 2ドル ${3:-$default_size}
     ;;
    open)
     vault=${2:-$DEFAULT_VAULT}
     [ -n "$vault" ] || die "Missing vault name"
     open_vault $vault
     ;;
    close)
     vault=${2:-$DEFAULT_VAULT}
     [ -n "$vault" ] || die "Missing vault name"
     close_vault $vault 1
     ;;
    dclose)
     vault=2ドル
     if [ -n "$vault" ]; then
     close_vault $vault 0
     else
     close_all_vault
     fi
     ;;
    is-open)
     vault=${2:-$DEFAULT_VAULT}
     [ -f $decrypted_vault_dir/$vault.img ] && exit 0 || exit 1
     ;;
    esac

    Petite subtilité supplémentaire permise par l’utilisation d’une carte OpenPGP : j’ai un script ~/.gnupg/scd-event appelé automatiquement par GnuPG à chaque « évènement » sur le lecteur de carte (insertion ou retrait de carte), avec le code suivant :

    #!/bin/bash
    card_status=8ドル
    case "$card_status" in
    NOCARD)
     vault dclose
     ;;
    esac

    qui me permet de refermer automatiquement le coffre simplement en retirant ma carte OpenPGP du lecteur.