Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

ChromeのCookieから値を取得する

More than 5 years have passed since last update.

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)

lifull
日本最大級の不動産・住宅情報サイト「LIFULL HOME'S」を始め、人々の生活に寄り添う様々な情報サービス事業を展開しています。
https://lifull.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away