2016-10-03 4 views
0

パスフレーズ(ASCII文字列)で既存のファイル名をハッシュする方法が必要ですが、後で同じパスフレーズを使用して元に戻すことができます。Bashでパスフレーズを使用して文字列をハッシュする

私は暗号がこれを行うことができることを知っています - 彼らは文字列を暗号化しています...しかし、出力の長さはファイル名の長さに基づいています。これはまさに私が望んでいないものです...主にファイルの長さ出力された文字列は、常にFSと互換性があるわけではありません。 Ex。 "\ n"と入力します。

明らかに、私は多くの研究を行い、いくつかのスクリプトを書いていましたが、すべてのソリューションが遅いか、まったく機能しません。

Goal of thisは、単一のパスフレーズを使用してすべて一度に「復号化」できる一定の長さのファイル名を取得することです。追加の「メタデータのような」ファイルを作成する必要はありません。

+2

それがすべてで可逆的なら、それは暗号化ハッシュではありません。それは彼らがどのように仕事をしているのか、彼らが何をしているのか、彼らが何をするのか、 –

+0

@CharlesDuffy私はそれを知っています、私は暗号がまさにこのためだと言いました。しかし、私はハッシュのプロパティのいくつかが必要です - 一定のハッシュ長さ、スピードなど – areuz

+1

(今、私はあなたが暗号化ハッシュの出力でいくつかのコンテンツxor'dを保存できると思います - あなたの目標をより詳細に記述すれば、より良い提案を得ることができます)。 –

答えて

1

私は私の最初の質問ですべての方法を得た。上記の問題に対する唯一の解決策があるように思われます。それは、(Jamesが示唆したように)フォーマットを保持する暗号化です。しかし、私が知る限り、これを行う既存のコマンドはありません。

私は非常に最初の選択肢でしたが、ファイル名をハッシュし、ハッシュとファイル名をプレーンファイル(ディレクトリごとに1つのファイル)に入れ、そのファイルをパスフレーズで暗号化しています。

ここに私のコードを掲載します。それはおそらく、最もかわいい、または最も移植性の高いコードではありませんが、仕事をして、本当に簡単です(IMO)。

#!/usr/bin/env bash 

man="Usage: namecrypt [ -h ] [ -e || -d ] [ -F ] [ -D ] [DIRECTORY] [PASSPHRASE]\n 
    -h, --help  display this message 

    -e, --encrypt  encrypt the specified directory 
    -d, --decrypt  decrypt the specified directory 

    -F, --files  include files 
    -D, --dir  include directories 

    [DIRECTORY]  relative or absolute path to a directory/symbolic link 
    [PASSPHRASE]  optional - specify the user passphrase on command line"; 

options=(); 
for Arg in "[email protected]"; do 
    if [ "$Arg" == "-h" ] || [ "$Arg" == "--help" ]; then 
     echo -e "$man"; exit; 
    elif [ "$Arg" == "-e" ] || [ "$Arg" == "--encrypt" ]; then 
     options[0]="E"; 
    elif [ "$Arg" == "-d" ] || [ "$Arg" == "--decrypt" ]; then 
     options[0]="D"; 
    elif [ "$Arg" == "-F" ] || [ "$Arg" == "--files" ]; then 
     options[1]="${options[1]}F"; 
    elif [ "$Arg" == "-D" ] || [ "$Arg" == "--dir" ]; then 
     options[1]="${options[1]}D"; 
    elif [ -d "$Arg" ]; then 
     options[2]="$(realpath "$Arg")"; 
    else  
     options[3]="$Arg";  
    fi; 
done; 

if [ "${options[0]}" == "" ]; then echo "No Mode specified!"; exit 1; fi; 
if [ "${options[1]}" == "" ]; then options[1]="F"; fi; 
if [ "${options[2]}" == "" ]; then echo "No such directory!"; exit 2; fi; 
if [ "${options[3]}" == "" ]; then echo "Enter a passphrase: "; read options[3]; fi; 

shopt -s nullglob dotglob; 

function hashTarget 
{ 
    BASE="$(basename "$1")"; 
    DIR="$(dirname "$1")/"; 

    if [ -a "$1" ]; then 
     oldName="$BASE"; 
     newName=$(echo "$oldName" | md5sum); 
     echo "$oldName||$newName" >> "$DIR.names"; 
     mv "$1" "$DIR$newName"; 
    else echo "Skipping '$1' - No such file or directory!"; 
    fi; 
} 

function dehashTarget 
{ 
    BASE="$(basename "$1")"; 
    DIR="$(dirname "$1")/"; 

    [ -f "$DIR.names.cpt" ] && ccdecrypt -K "${options[3]}" "$DIR.names.cpt"; 

    if [ -f "$DIR.names" ]; then 
     oldName="$BASE"; 
     newName=$(grep "$oldName" "$DIR.names" | awk -F '|' '{print $1}'); 
     [[ ! -z "${newName// }" ]] && mv "$1" "$DIR$newName"; 
    else 
     echo "Skipping '$1' - Hash table not found!"; 
    fi; 
} 

function mapTarget 
{ 
    DIR="$(dirname "$1")/"; 

    for Dir in "$1"/*/; do 
     mapTarget "$Dir"; 
    done; 

    for Item in "$1"/*; do 
     if ([ -f "$Item" ] && [[ "${options[1]}" == *"F"* ]]) || 
      ([ -d "$Item" ] && [[ "${options[1]}" == *"D"* ]]); then 

      if [ "${options[0]}" == "E" ]; then 
       hashTarget "$Item"; 
      else 
       dehashTarget "$Item"; 
      fi; 
     fi; 
    done; 

    [ "${options[0]}" == "D" ] && [ -f "$DIR.names" ] && rm "$DIR.names"; 
    [ "${options[0]}" == "E" ] && [ -f "$DIR.names" ] && ccencrypt -K "${options[3]}" "$DIR.names"; 

} 

mapTarget "${options[2]}"; 

私はOOPと気にしませんでしたので、それは、とても長いですされている理由おそらく唯一の理由、と私はまた、名前のない時間のほとんどは、マングルされ得ることを確認するチェックと手順の多くをやりました復元することはできません - ユーザーエラーがこれを引き起こす可能性があります。

これは、ハッシュ・テーブル・ファイルを暗号化するために使用されるコマンドです:CCrypt

+0

コードに関する変更やコメントはもちろん歓迎します。私は本当に熟練したbashプログラマーではない。 – areuz

+0

それはかなり良い解決策です!それは私がハッシュテーブルを構築することを意味していました:-) – mahatmanich

+1

@mahatmanichありがとう!私はまったく新しいコードを再投稿しました。古いものはバグがあり、ディレクトリ名にスペースのような制限があり、特定のエラーチェックをしませんでした。 – areuz

関連する問題