[今日の学習]byte[]<>String符号化問題(feat.base 64)


パスワードのコーディング
Google tinkライブラリを使用すると、パスワード文はbyte[]を返し、文字列を再取得するために復号されます.ただし、現在のプロジェクトのデータベースにパスワード文が格納されている部分はVARCHARです.変更するにはflywayスクリプトなどを作成してください.面倒なところが多い気がするしたがって、暗号文を文字列に変換して保存し、復号時に文字列をbyte[]に変換して使用する.
// 대충 이런 느낌
String plaintext;
byte[] cipher = encrypt(plaintext);
String cipherString = new String(cipher, "UTF-8");

byte[] maybeCipher = cipherString.getBytes(StandardCharsets.UTF_8)
byte[] decipher = decrypt(cipher);
String plaintext = new String(decipher, "UTF-8");

// cipher와 maybeCipher가 다름 
しかし、上記のようにコードを記述し、復号に失敗した.デバッガから見ると、ciphermaybeCipherの価格が違います.同じUTF-8符号化方式が指定されているので良いと思いますが、これはUTF-8では表現できない値のようです.UTF-8が可変長であることが原因と疑われている.だからbase 64方式を使用しました.よかった!
// 대충 이런 느낌
String plaintext;
byte[] cipher = encrypt(plaintext);
String cipherString = Base64.getEncoder().encodeToString(cipher);

byte[] maybeCipher = Base64.getDecoder().decode(cipherString);
byte[] decipher = decrypt(cipher);
String plaintext = new String(decipher, "UTF-8");

// cipher와 maybeCipher가 동일함
Base64
JWTがbase 64符号化であることを毎日知っているので、どんな符号化方式なのか考えていなかったので、DBの修正の苦しみに報いるために探しました.
Base 64(Base 60)は、8ビットのバイナリデータ(例えば実行可能ファイルまたはZIPファイル)を、汎用ASCII領域のみの文字(文字コードの影響を受けない)の文字列のセットに変換する符号化方法である.
--ウィキペディア
名前のように64文字を表すことができます.2^6=64、すなわち6ビットで符号化される.3バイトのデータ(8*3)は最大33%増加し、最大4文字(6*4)は6ビットを使用するためです.固定サイズの符号化であるため、文字列のほか、画像などのバイトデータの符号化にも適している.

逆にUTF-8は、Unicode文字セットの文字を符号化する方法(バイナリ符号化)である.用途が違うから、次は混同しないでください.