ChromeのCookieからニコニコのsessionの値を読み出そうと思った時に,暗号化されてたみたいなので,その時調べたことをメモ
参考にしたページはここ
ほぼ参考にしたページをrubyで書いただけですね
それと,面倒くさかったのでmacでしか動かないです.
1. Cookieから目的のものを探す
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: File.expand_path('~/Library/Application Support/Google/Chrome/Default/Cookies')
)
class Cookie < ActiveRecord::Base
self.table_name = 'cookies'
end
val = Cookie.where(host_key: '.nicovideo.jp', name: 'user_session').first.encrypted_value
2. Keychainからpasswordを取得
復号するときのkeyを作成するためのパスワードが,KeychainのChrome Safe Storageに保存されてるのでそれを取得
def chrome_pass
Keychain.generic_passwords.where(account: 'Chrome').first.password
end
3. passwordからkeyを作成
def generate_key(pass)
salt = 'saltysalt'
iter = 1003
length = 16
OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, length)
end
どうしてこの値を使ってるのかは分かりません.誰か知ってたら教えて下さい
4. Cookieの値をkeyで復号
def chrome_decrypt(encrypted_value, key)
iv = (' ' * 16)
encrypted_value.slice!(0, 3)
chiper = OpenSSL::Cipher::AES.new(128, :CBC)
chiper.decrypt
chiper.key = key
chiper.iv = iv
chiper.update(encrypted_value) << chiper.final
end
puts chrome_decrypt(val, generate_key(chrome_pass))
なんで復号の時にこれやってるのとかわからずにrubyで書きなおしただけなので質問されてもわからないです.
最後にプログラム全体を書いときます
require 'active_record'
require 'sqlite3'
require 'keychain'
# Chrome Safe Storageのpasswordを取得
def chrome_pass
Keychain.generic_passwords.where(account: 'Chrome').first.password
end
# 複号化の鍵を作成
def generate_key(pass)
salt = 'saltysalt'
iter = 1003
length = 16
ret = OpenSSL::PKCS5.pbkdf2_hmac_sha1(pass, salt, iter, length)
end
def chrome_decrypt(encrypted_value, key)
iv = (' ' * 16)
encrypted_value.slice!(0, 3)
chiper = OpenSSL::Cipher::AES.new(128, :CBC)
chiper.decrypt
chiper.key = key
chiper.iv = iv
chiper.update(encrypted_value) << chiper.final
end
ActiveRecord::Base.establish_connection(
adapter: 'sqlite3',
database: File.expand_path('~/Library/Application Support/Google/Chrome/Default/Cookies')
)
class Cookie < ActiveRecord::Base
self.table_name = 'cookies'
end
val = Cookie.where(host_key: '.nicovideo.jp', name: 'user_session').first.encrypted_value
key = generate_key(chrome_pass)
puts chrome_decrypt(val, key)