base64 -d 디코딩하지만 입력이 유효하지 않다고 표시됩니다.

base64 -d 디코딩하지만 입력이 유효하지 않다고 표시됩니다.

왜 이런 일이 발생하고 해결 방법을 아는 사람이 있습니까?

me@box:~$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ" | base64 -di
{"foo":"bar","baz":"bat"}base64: invalid input

답변1

반대로 하면 문자열이 불완전하다는 것을 알 수 있습니다.

$ echo '{"foo":"bar","baz":"bat"}' | base64
eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=

$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQo=" | base64 -di
{"foo":"bar","baz":"bat"}

발췌입력 길이를 3으로 나눌 수 없는 경우 base64 인코딩에 패딩이 필요한 이유는 무엇입니까?

필러 문자란 무엇입니까?

패딩 문자는 길이 요구 사항을 충족하는 데 도움이 되지만 의미는 없습니다.

그러나 패딩은 매우 간단한 네트워크 프로토콜에서 발생할 수 있는 것처럼 Base64로 인코딩된 문자열이 개별 시퀀스의 길이가 손실되는 방식으로 연결되는 상황에서 유용합니다.

채워지지 않은 문자열을 연결하면 각 개별 시퀀스의 끝 부분에 있는 홀수 바이트에 대한 정보가 손실되므로 원본 데이터를 복구할 수 없습니다. 그러나 패딩 시퀀스를 사용하면 모호함이 없어 전체 시퀀스를 정확하게 디코딩할 수 있다.

답변2

명령줄 도구는 입력 길이가 4의 배수가 되도록 적절한 패딩 문자 수를 선택합니다. 문자열의 길이는 34자이므로 =끝에 패딩으로 두 개의 기호가 있어야 합니다.

$ echo "eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ==" | base64 -di; echo
{"foo":"bar","baz":"bat"}

입력에 패딩 문자가 누락된 경우 결과는 구현에 따라 다릅니다. 올바른 Base64 인코딩 abcd은 다음과 같습니다 YWJjZA==.

% echo -n abcd |base64
YWJjZA==

패딩 문자를 제거한 상태에서 디코딩을 시도하면 마지막 부분은 다음과 같습니다.조용히 떨어지다Mac의 경우:

% echo 'YWJjZA' |base64 -d
abc

GNU 구현을 사용하면 전체 출력이 표시되지만 stderr에 오류 메시지가 표시됩니다.

$ echo 'YWJjZA' |base64 -d
abcdbase64: invalid input

답변3

GNU에서는 base64 -d적절한 패딩이 필요합니다(입력 길이는 4의 배수여야 함). 다른 base64디코더는 더 똑똑할 수 있으며 패딩이 필요하지 않습니다(예: Mac/BSD는 base64 -D패딩이 필요하지 않습니다).

다음은 문자열을 자동으로 올바르게 채우는 bash 명령입니다 base64. 이렇게 하면 "잘못된 입력" 오류가 발생하지 않습니다.

str="eyJmb28iOiJiYXIiLCJiYXoiOiJiYXQifQ"

echo "$str"==== | fold -w 4 | sed '$ d' | tr -d '\n' | base64 --decode

설명하다:

  • echo "$str"====등호 4개를 추가하세요.
  • fold -w 44자마다 별도의 줄로 분할
  • sed '$ d'마지막 행 제거(관련 없는 패딩)
  • tr -d '\n'모든 행을 연결

관련 정보