일반적인 Unix 도구를 사용하여 base64url 디코딩/인코딩

일반적인 Unix 도구를 사용하여 base64url 디코딩/인코딩

일반적인 coreutils base64 도구는 base64url을 인코딩/디코딩할 수 없습니다. base64url의 패딩은 =선택 사항이며 알파벳의 마지막 두 문자는 -및 입니다 _. [0][1] 일반적인 Unix 도구를 사용하여 base64url을 인코딩하고 디코딩하는 쉬운 방법은 무엇입니까?

배경: 이 문제는 JWT(RFC7519)를 사용할 때 발생합니다.

[0]:https://www.rfc-editor.org/rfc/rfc4648#section-5
[1]:https://en.wikipedia.org/wiki/Base64#Variants_summary_table

답변1

나중에 참고할 수 있도록 내 질문에 스스로 대답합니다.

base64url::encode () { base64 -w0 | tr '+/' '-_' | tr -d '='; }
base64url::decode () { awk '{ if (length($0) % 4 == 3) print $0"="; else if (length($0) % 4 == 2) print $0"=="; else print $0; }' | tr -- '-_' '+/' | base64 -d; }

일부 테스트:

$ echo 'he' | base64url::encode
aGUK
$ echo 'aGUK' | base64url::decode
he

$ echo 'hel' | base64url::encode
aGVsCg
$ echo 'aGVsCg' | base64url::decode
hel

$ echo 'hell' | base64url::encode
aGVsbAo
$ echo 'aGVsbAo' | base64url::decode
hell

$ echo 'hello' | base64url::encode
aGVsbG8K
$ echo 'aGVsbG8K' | base64url::decode
hello

$ dd if=/dev/urandom bs=1 count=1M > ./test.bin
1048576+0 records in
1048576+0 records out
1048576 bytes (1.0 MB, 1.0 MiB) copied, 3.1961 s, 328 kB/s

$ sha256sum ./test.bin
a9d5268ac338fa273245073e463058d9399221c5a60d8bea6cc20cab601863e6  ./test.bin

$ sha256sum <(base64url::encode < ./test.bin | base64url::decode)
a9d5268ac338fa273245073e463058d9399221c5a60d8bea6cc20cab601863e6  /dev/fd/63

관련 정보