15 |
15 |
module Keep
|
16 |
16 |
ACCOUNT_FILE = File.join(Environment::SETTINGDIR, 'core', 'token').freeze
|
17 |
17 |
ACCOUNT_TMP = (ACCOUNT_FILE + ".write").freeze
|
18 |
|
ACCOUNT_CRYPT_KEY_LEN = 16
|
|
18 |
# 暗号化ライブラリが32 bytesを要求してくる。
|
|
19 |
ACCOUNT_CRYPT_KEY_LEN = 32
|
19 |
20 |
|
20 |
21 |
extend Keep
|
21 |
22 |
@@service_lock = Monitor.new
|
22 |
23 |
|
|
24 |
# 暗号化手法を統一して扱いたいので共有変数にする。
|
|
25 |
@@cipher = OpenSSL::Cipher.new('aes-256-cbc')
|
|
26 |
|
23 |
27 |
def key
|
24 |
|
key = UserConfig[:account_crypt_key] ||= SecureRandom.random_bytes(ACCOUNT_CRYPT_KEY_LEN)
|
25 |
|
key[0, ACCOUNT_CRYPT_KEY_LEN] end
|
|
28 |
# また暗号化方法が将来的な非推奨になった時に、削除される前に変換出来るように暗号化方法を保存しておく。
|
|
29 |
account_crypt =
|
|
30 |
UserConfig[:account_crypt] || { key: SecureRandom.random_bytes(ACCOUNT_CRYPT_KEY_LEN).to_s, cipher_name: @@cipher.name }
|
|
31 |
UserConfig[:account_crypt] = account_crypt
|
|
32 |
account_crypt[:key][0, ACCOUNT_CRYPT_KEY_LEN] end
|
26 |
33 |
|
27 |
34 |
# 全てのアカウント情報をオブジェクトとして返す
|
28 |
35 |
# ==== Return
|
... | ... | |
122 |
129 |
account_data end
|
123 |
130 |
|
124 |
131 |
def encrypt(str)
|
125 |
|
cipher = OpenSSL::Cipher.new('bf-ecb').encrypt
|
126 |
|
cipher.key_len = ACCOUNT_CRYPT_KEY_LEN
|
127 |
|
cipher.key = key
|
128 |
|
cipher.update(str) << cipher.final end
|
|
132 |
@@cipher.encrypt
|
|
133 |
@@cipher.key_len = ACCOUNT_CRYPT_KEY_LEN
|
|
134 |
@@cipher.key = key
|
|
135 |
@@cipher.update(str) << @@cipher.final
|
|
136 |
rescue StandardError => exception
|
|
137 |
chi_fatal_alert exception.inspect
|
|
138 |
end
|
129 |
139 |
|
130 |
140 |
def decrypt(binary_data)
|
131 |
|
cipher = OpenSSL::Cipher.new('bf-ecb').decrypt
|
132 |
|
cipher.key = key
|
133 |
|
str = cipher.update(binary_data) << cipher.final
|
|
141 |
@@cipher.decrypt
|
|
142 |
@@cipher.key = key
|
|
143 |
str = @@cipher.update(binary_data) << @@cipher.final
|
134 |
144 |
str.force_encoding(Encoding::UTF_8)
|
135 |
|
str end
|
|
145 |
str
|
|
146 |
rescue StandardError => exception
|
|
147 |
chi_fatal_alert <<~"EOS"
|
|
148 |
暗号の復号時にエラーが起きました。
|
|
149 |
mikutterがアップデートしたり、
|
|
150 |
システムのOpenSSLがアップデートされたりした場合にこのエラーが起きた場合は、
|
|
151 |
~/.mikutter/settings/setting.ymlからaccount_cryptで始まるものを消して、
|
|
152 |
~/.mikutter/settings/core/tokenファイルを消して、
|
|
153 |
アカウントを再認証すると上手くいく可能性があります。
|
|
154 |
|
|
155 |
#{exception.inspect}
|
|
156 |
EOS
|
|
157 |
end
|
136 |
158 |
|
137 |
159 |
private
|
138 |
160 |
|