趣味でアプリをデコンパイルして、難読化されたコードを眺めていたら、変な文字列を見つけました。
VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu
VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy
VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu
おゅ。これはやばベタ書きsecretか〜〜〜ってコードを読んでいたらなんか変。適当にgithubを検索したらこんな箇所を見つけました。
/// Note: Due to limitations in Android's SharedPreferences,
/// values cannot start with any one of the following:
///
/// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu'
/// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy'
/// - 'VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu'
何やこれ、おもろ。
真剣にコードを読んだらBigInteger、List、DoubleはSharedPreferences.EditorにputXXXがないので、prefixをつけているという話でした。
private static final String LIST_IDENTIFIER = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu";
private static final String BIG_INTEGER_PREFIX = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2Vy";
private static final String DOUBLE_PREFIX = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBEb3VibGUu";
じゃあなんでこんな命名にしたの? 答えはすでにpublic archiveとなっている方の、flutter/pluginsのレポジトリにあります。
// Fun fact: The following is a base64 encoding of the string "This is the prefix for a list."
private static final String LIST_IDENTIFIER = "VGhpcyBpcyB0aGUgcHJlZml4IGZvciBhIGxpc3Qu";
Fun fact だった。
同様に、"This is the prefix for BigInteger"と"This is the prefix for Double."のbase64だった。
ちょっと待って、"This is the prefix for BigInteger"の方は、最後のピリオドがないやんけw
なので、BIG_INTEGER_PREFIX は、本当は、"This is the prefix for BigInteger."のbase64エンコードである"VGhpcyBpcyB0aGUgcHJlZml4IGZvciBCaWdJbnRlZ2VyLg=="であるべきです。
PR 出すか〜(いいえ)
flutter/packagesのshared_preferencesの小ネタ終わり。