base64 출력에 불일치가 발생하는 이유는 무엇입니까?


12

lubuntu 15.04에서 Java 기반 neo4j 그래프 데이터베이스를 사용하고 있습니다.

neo4j HTTP 인증 헤더는 'username : password'(따옴표 제외)의 base64 인코딩을 사용합니다. wireshark를 사용하면 neo4j에 의해 생성 된 base64 코드를 볼 수 있습니다.

그러나 우분투 coreutils base64를 사용하여 동일한 문자열을 인코딩하면 약간 다른 인코딩이 발생합니다. 이 인코딩은 neo4j에서 허용되지 않습니다.

두 인코딩 모두 올바른 username : password 문자열로 디코딩

username = neo4j및 비밀번호 =@N

Neo4j는 인코딩 된 값의 부여 neo4j:@NbmVvNGo6QE4=을 디코딩 neo4j:@N예상을

$ echo 'bmVvNGo6QE4=' | base64 --decode
neo4j:@N

Ubuntu coreutils base64는 인코딩 된 값인 neo4j:@Nas bmVvNGo6QE4K(마지막 문자가 다름)를 반환 하지만 여전히 올바르게 디코딩합니다.

$ echo 'neo4j:@N' | base64
bmVvNGo6QE4K
$ echo 'bmVvNGo6QE4K' | base64 --decode
neo4j:@N

왜 이런거야? 일관된 인코딩을 얻으려면 무엇이 필요합니까?


3
참고 =정상 Base64로에 패딩 (끝 부분 만 유효). 하나의 인코딩 된 문자열에 패딩이 있고 다른 인코딩 된 문자열에 패딩이 없다는 사실 (또는 더 일반적으로 두 문자열의 패딩 양이 다름)은 길이다르 므로 동일하지 않을 수 있습니다.
CVn

답변:


56

다른 문자열을 (약간) 인코딩하고 있습니다.

$ echo 'bmVvNGo6QE4=' | base64 --decode | od -c
0000000   n   e   o   4   j   :   @   N
0000010
$ echo 'neo4j:@N' | od -c
0000000   n   e   o   4   j   :   @   N  \n
0000011

echo후행 줄 바꿈 문자를 추가합니다. 이것은 다른 인코딩으로 이어집니다.

printf출력 사양이 더 정확한 대신 사용하십시오 .

$ printf '%s' 'neo4j:@N' | base64              
bmVvNGo6QE4=

10
좋은 대답입니다. 참고 $ echo -n "neo4j:@N" | base64도 작동합니다.
Doug Smythies

7
@DougSmythies는 그렇게하지만 printf훨씬 일관성이echo 있습니다.
muru
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.