2016-10-03 3 views
0

암호문 (ASCII 문자열)을 사용하여 기존 파일 이름을 해시하는 방법이 필요하지만 나중에 동일한 암호를 사용하여 되돌릴 수 있어야합니다.Bash에서 암호문을 사용하여 문자열 해싱

나는 암호가 이것을 할 수 있음을 알고 있습니다 - 문자열을 암호화하고 있습니다 ... 그러나 출력 길이는 파일명 길이에 따라 결정됩니다. 이는 내가 원하지 않는 것입니다 ... 주로 파일 길이가 두 배가되기 때문에 주로 발생합니다 , 출력 된 문자열은 항상 FS와 호환되지 않습니다. 전의. "\ n"파일 이름.

분명히하기 위해 많은 연구를했고 스크립트를 작성하기도했지만 모든 솔루션이 느리거나 응용 프로그램이 전혀 작동하지 않습니다.

Goal of this은 하나의 암호를 사용하여 한 번에 모두 '해독 할 수있는'일정한 길이의 파일 이름을 얻는 것입니다. 추가 '메타 데이터와 유사한'파일을 만들 필요가 없습니다.

+2

, 그것은 암호 해시 아니다 :

해시 테이블 파일을 암호화하는 데 사용되는 명령입니다. 그건 그들이 일하는 방식 /하는 일 /하는 일이 아닙니다. –

+0

@CharlesDuffy 알아, 나는 암호가 이것을 위해 정확히 언급했다. 하지만 난 해시의 속성 중 일부가 필요합니다. 해시 길이, 속도 등이 동일해야합니다. – areuz

+1

(이제는 암호화 해시의 출력으로 일부 콘텐츠 xor'd를 저장할 수 있다고 가정합니다. 원하는 것을 선택하십시오. 그러나 목표를 자세히 설명하면 더 나은 제안을 얻을 수 있습니다.) –

답변

1

나는 나의 초기 질문으로 모든 것을 배웠다. 위의 문제에 대한 단 하나의 해결책이있는 것으로 보이며, 이는 형식 유지 암호화입니다. 알다시피, 내가 알 수있는 한, 이것을하는 기존의 명령은 없습니다.

그래서 첫 번째 옵션은 정확히 무엇을 했는가? 파일 이름을 해시하고 해시 및 파일 이름을 일반 파일 (디렉토리 당 하나의 파일)에 넣고 암호를 사용하여 파일을 암호화합니다.

여기에 내 코드를 게시 할 예정입니다. 아마 가장 예쁜 코드는 아니지만 이식성이 뛰어나지 만 작업은 정말 간단합니다 (IMO). 내가 어떤 OOP 신경 쓰지 않았고, 나 또한 확인하고 많은 단계가 대부분의 시간에는 이름이 엉망이 얻을 있는지 확인했기 때문에

#!/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]}"; 

아마 그것이 너무 오래 왜 유일한 이유는 복원 할 수 없습니다. 사용자 오류로 인해 여전히이 문제가 발생할 수 있습니다. 전혀 되돌릴 수 있다면 CCrypt

+0

코드에 대한 변경이나 의견은 물론 환영합니다. 나는 숙련 된 bash 프로그래머가 아니다. – areuz

+0

꽤 좋은 해결책입니다! 그것이 내가 해시 테이블을 만들 때 의미하는 바입니다 .-) – mahatmanich

+1

@mahatmanich 감사합니다!나는 완전히 새로운 코드를 재 게시했는데, 오래된 코드는 버그가있어서 디렉터리 이름에 공백과 같은 제한이 있었고 특정 오류 검사를하지 않았다. – areuz