# 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