module Veritrans::Tercerog::Mdk::AuthHashUtil

パラメータ改竄チェッククラス

パラメータが改竄されているかどうかをチェック機能を提供します。

Public Class Methods

check_auth_hash?(request_params, merchant_cc_id, merchant_pw, charset) click to toggle source

リクエストパラメータ内のパラメータ順序(authParams)に従ってハッシュ値を計算し、

リクエストパラメータ内の改竄チェック用ハッシュ値(vAuthInfo)と比較する。 リクエストパラメータにパラメータ順序と改竄チェック用ハッシュ値が含まれていない場合、 改竄されているとみなす。

@param

request_params リクエストパラメータ

@param

merchant_cc_id マーチャントCCID

@param

merchant_pw マーチャント認証鍵

@param

charset 文字コード

@return

true 一致 or false 不一致(改竄されている)

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 31
def check_auth_hash?(request_params, merchant_cc_id, merchant_pw, charset)

  if request_params.nil? || !request_params.is_a?(Hash)
    return false
  end

  # パラメータ順序の取得
  auth_param = self::get_first_value(request_params[:authParams])
  if auth_param.nil?
    return false
  end

  # 改竄チェック用ハッシュ値の取得
  v_auth_info = self::get_first_value(request_params[:vAuthInfo])
  if v_auth_info.nil?
    return false
  end

  begin
    # ハッシュ値の算出
    hash = self::create_auth_hash_info(request_params, auth_param, merchant_cc_id, merchant_pw, charset)
    if !hash.nil? && hash == v_auth_info
      return true
    end
  rescue => e
    Veritrans::Tercerog::Mdk::logger.debug("!!!!!!!!!! Error has occurred in create_auth_hash_info()")
    Veritrans::Tercerog::Mdk::logger.debug(e)
    if !e.backtrace.nil?
      Veritrans::Tercerog::Mdk::logger.debug(e.backtrace.join("\n"))
    end
  end
  return false
end
create_auth_hash_info(request_params, auth_params, merchant_cc_id, merchant_pw, charset) click to toggle source

ハッシュ値を算出する。

@param

request_params リクエストパラメータ

@param

auth_params パラメータ順序

@param

merchant_cc_id マーチャントCCID

@param

merchant_pw マーチャント認証鍵

@param

charset 文字コード

@return

ハッシュ値

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 77
def create_auth_hash_info(request_params, auth_params, merchant_cc_id, merchant_pw, charset)

  if merchant_cc_id.nil? || merchant_pw.nil?
    return nil
  end

  # デコードする。
  decoded_params = self::mdk_base64_decode(auth_params)
  keys = decoded_params.split(',')

  # パラメータを連結する。
  str_params = ""
  str_params << merchant_cc_id
  keys.each do |key|
    value = request_params[key]
    if value.nil?
      return nil
    end
    str_params << value
  end
  str_params << merchant_pw

  # コンフィグからエンコードを取得する。
  config = Veritrans::Tercerog::Mdk::MdkConfig.instance
  encode = config[:DTO_ENCODE]

  # 連結したパラメータ値から指定されたアルゴリズムのダイジェストを生成する。
  str_params = Veritrans::Tercerog::Mdk::MdkUtils::mdk_encode_from(encode, str_params)
  return OpenSSL::Digest::SHA256.hexdigest(str_params)
end
get_first_value(value) click to toggle source

指定した値に格納された先頭の値を取得する。

・指定した値が配列の場合は、配列の先頭の値を取得する。 ・指定した値が配列ではない場合は、指定した値をそのまま返す。 ・指定した値が空配列である場合はnilを取得する。

@param

value 配列もしくは値

@return

先頭の値

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 118
def get_first_value(value)

  if !value.nil? and value.is_a?(Array)
    if 1 <= value.size
      param = value[0]
    else
      param = nil
    end
  else
    return value
  end
  return param
end
mdk_base64_decode(data) click to toggle source

Bese64デコードを行う。

@param

data デコードする文字列

@return

デコードを行った結果の文字列

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 138
def mdk_base64_decode(data)

  target = data ? data.to_s.dup : ""
  target.gsub!('*', '=')
  target.gsub!('-', '/')
  target.gsub!('_', '+')
  target.gsub!(' ', '+')

  return target.unpack('m').first
end

Private Instance Methods

check_auth_hash?(request_params, merchant_cc_id, merchant_pw, charset) click to toggle source

リクエストパラメータ内のパラメータ順序(authParams)に従ってハッシュ値を計算し、

リクエストパラメータ内の改竄チェック用ハッシュ値(vAuthInfo)と比較する。 リクエストパラメータにパラメータ順序と改竄チェック用ハッシュ値が含まれていない場合、 改竄されているとみなす。

@param

request_params リクエストパラメータ

@param

merchant_cc_id マーチャントCCID

@param

merchant_pw マーチャント認証鍵

@param

charset 文字コード

@return

true 一致 or false 不一致(改竄されている)

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 31
def check_auth_hash?(request_params, merchant_cc_id, merchant_pw, charset)

  if request_params.nil? || !request_params.is_a?(Hash)
    return false
  end

  # パラメータ順序の取得
  auth_param = self::get_first_value(request_params[:authParams])
  if auth_param.nil?
    return false
  end

  # 改竄チェック用ハッシュ値の取得
  v_auth_info = self::get_first_value(request_params[:vAuthInfo])
  if v_auth_info.nil?
    return false
  end

  begin
    # ハッシュ値の算出
    hash = self::create_auth_hash_info(request_params, auth_param, merchant_cc_id, merchant_pw, charset)
    if !hash.nil? && hash == v_auth_info
      return true
    end
  rescue => e
    Veritrans::Tercerog::Mdk::logger.debug("!!!!!!!!!! Error has occurred in create_auth_hash_info()")
    Veritrans::Tercerog::Mdk::logger.debug(e)
    if !e.backtrace.nil?
      Veritrans::Tercerog::Mdk::logger.debug(e.backtrace.join("\n"))
    end
  end
  return false
end
create_auth_hash_info(request_params, auth_params, merchant_cc_id, merchant_pw, charset) click to toggle source

ハッシュ値を算出する。

@param

request_params リクエストパラメータ

@param

auth_params パラメータ順序

@param

merchant_cc_id マーチャントCCID

@param

merchant_pw マーチャント認証鍵

@param

charset 文字コード

@return

ハッシュ値

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 77
def create_auth_hash_info(request_params, auth_params, merchant_cc_id, merchant_pw, charset)

  if merchant_cc_id.nil? || merchant_pw.nil?
    return nil
  end

  # デコードする。
  decoded_params = self::mdk_base64_decode(auth_params)
  keys = decoded_params.split(',')

  # パラメータを連結する。
  str_params = ""
  str_params << merchant_cc_id
  keys.each do |key|
    value = request_params[key]
    if value.nil?
      return nil
    end
    str_params << value
  end
  str_params << merchant_pw

  # コンフィグからエンコードを取得する。
  config = Veritrans::Tercerog::Mdk::MdkConfig.instance
  encode = config[:DTO_ENCODE]

  # 連結したパラメータ値から指定されたアルゴリズムのダイジェストを生成する。
  str_params = Veritrans::Tercerog::Mdk::MdkUtils::mdk_encode_from(encode, str_params)
  return OpenSSL::Digest::SHA256.hexdigest(str_params)
end
get_first_value(value) click to toggle source

指定した値に格納された先頭の値を取得する。

・指定した値が配列の場合は、配列の先頭の値を取得する。 ・指定した値が配列ではない場合は、指定した値をそのまま返す。 ・指定した値が空配列である場合はnilを取得する。

@param

value 配列もしくは値

@return

先頭の値

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 118
def get_first_value(value)

  if !value.nil? and value.is_a?(Array)
    if 1 <= value.size
      param = value[0]
    else
      param = nil
    end
  else
    return value
  end
  return param
end
mdk_base64_decode(data) click to toggle source

Bese64デコードを行う。

@param

data デコードする文字列

@return

デコードを行った結果の文字列

# File tgMdk/lib/tg_mdk/mdk_auth_hash_util.rb, line 138
def mdk_base64_decode(data)

  target = data ? data.to_s.dup : ""
  target.gsub!('*', '=')
  target.gsub!('-', '/')
  target.gsub!('_', '+')
  target.gsub!(' ', '+')

  return target.unpack('m').first
end