質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.50%

  • Ruby

    7684questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7282questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MySQL

    5860questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • OpenSSL

    108questions

    OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。

RailsでDBの暗号化されたdataカラムを復号化してindexで表示

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 214

kozica

score 26

 実現したいこと

RailsでDBの暗号化されたdataカラムを復号化してindexで表示したいです。
復号化としては、logidカラムの文字列から重複した文字を削除した文字列を復号鍵として、opensslのaes-256-ecb方式で復号化しているものとなります
そのコードをruby単体ファイルで作成して実行できることを確認しています。
それをrailsにどう組み込めばいいのかがわかりません。

特に、DBのカラム値を呼び出し処理して返すのがどうすればいいかよくわかりません。
お力をかしてください

 単体ファイルでの復号化コード

require 'openssl'
require 'base64'

logid = ""
data = ""

cipher = OpenSSL::Cipher.new("aes-256-ecb")
cipher.decrypt
key = logid.each_char.uniq.join   #logidの文字列の文字を取り出し、重複する要素を削除して新しく文字列を作成
cipher.key = (key + "\0"*32)[0,32]
decrypted = cipher.update(Base64.decode64 data) + cipher.final  

p decrypted

Railsファイル

#personal_logs_controller.rb
class PersonalLogsController < ApplicationController
  before_action :set_personal_log, only: [:show, :edit, :update, :destroy]

  def index
    @personal_logs = PersonalLog.all
  end

  def show
  end

  def new
    @personal_log = PersonalLog.new
  end

  def edit
  end

  def create
    @personal_log = PersonalLog.new(personal_log_params)

    respond_to do |format|
      if @personal_log.save
        format.html { redirect_to @personal_log, notice: 'Personal log was successfully created.' }
        format.json { render :show, status: :created, location: @personal_log }
      else
        format.html { render :new }
        format.json { render json: @personal_log.errors, status: :unprocessable_entity }
      end
    end
  end

  def update
    respond_to do |format|
      if @personal_log.update(personal_log_params)
        format.html { redirect_to @personal_log, notice: 'Personal log was successfully updated.' }
        format.json { render :show, status: :ok, location: @personal_log }
      else
        format.html { render :edit }
        format.json { render json: @personal_log.errors, status: :unprocessable_entity }
      end
    end
  end

  def destroy
    @personal_log.destroy
    respond_to do |format|
      format.html { redirect_to personal_logs_url, notice: 'Personal log was successfully destroyed.' }
      format.json { head :no_content }
    end
  end

  private
    # Use callbacks to share common setup or constraints between actions.
    def set_personal_log
      @personal_log = PersonalLog.find(params[:id])
    end

    # Never trust parameters from the scary internet, only allow the white list through.
    def personal_log_params
      params.fetch(:personal_log, {})
    end
end
#index.html.erb
<p id="notice"><%= notice %></p>

<h1>Personal Logs</h1>

<table border = "5">

<thead>
  <tr>
    <th>data</th>
  </tr>
</thead>
    <% @personal_logs.each do |personal_log| %>
      <tbody>
      <tr>
        <td><%= personal_log.decrypted_data %></td>
      </tr>
      </tbody>
    <% end %>
</table>
#model/personal_log.rb
require 'openssl'
require 'base64'

class PersonalLog < ApplicationRecord
    def decrypted_data
        return self.id
    end
end

 補足情報(FW/ツールのバージョンなど)

OS:ubuntu18
ruby:2.5.1
Mysql

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

モデルに復号処理を書いて、ビューではそれを表示すれば良いでしょう。

# app/models/personal_log.rb
require 'openssl'
require 'base64'

class PersonalLog < ApplicationRecord

  # dataを復号した結果を返す
  def decrypted_data
    cipher = OpenSSL::Cipher.new("aes-256-ecb")
    cipher.decrypt
    key = self.logid.each_char.uniq.join
    cipher.key = (key + "\0"*32)[0,32]
    return cipher.update(Base64.decode64 self.data) + cipher.final  
  end

end

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/07/17 10:55

    NoMethodError in PersonalLogs#indexというエラーがでてしまいました(泣)
    モデルクラスに書き込む処理はどのように書き変えたらいいでしょうか??
    require 'openssl'
    require 'base64'

    class PersonalLog < ApplicationRecord
    def decrypted_data
    self.data
    cipher = OpenSSL::Cipher.new('aes-256-ecb')
    cipher.decrypt
    key = logid.each_char.uniq.join
    cipher.key = (key + "\0"*32)[0,32]
    data = cipher.updata(Base64.decode64 data) + cipher.final

    return
    end
    end

    キャンセル

  • 2018/07/17 11:01

    NoMethodError in PersonalLogs#index というエラーが出る時点でおかしいですよね?
    モデルなら、単数形PersonaLogになるはずだし、コントローラならPersonalLogsControllerというクラス名のはず。
    どこにPersonalLogs#indexとなる要素があるのか、こちらでは分かりません。

    キャンセル

  • 2018/07/17 11:05 編集

    コメントでコードのやり取りはしたくありません。
    というのも、teratailのコメントではコードに色が付かないし、インデントも効かないので、見づらいためです。
    質問に書き換えた後のモデルとコントローラ、ビューをコードブロックで修正してください。

    そもそも元のコードがきちんと動いているのかというのもこちらでは同じ環境でないため分かりません。
    とりあえず、まずは復号処理から離れてモデルに定義したメソッドをビューでも使えるのかという段階を確認させてください。
    回答を修正します。

    回答を修正しました。PersonalLog#decrypted_dataは単に自身のidをreturnするだけにしました。
    これでまず動作するか確認してください。
    これが動かせないと、復号処理を書く段階に行けません。

    キャンセル

  • 2018/07/17 11:25

    上記の修正回答はidが表示されて問題なく動きました!

    キャンセル

  • 2018/07/17 11:30

    ようやく、復号処理を書く段階です。

    まずは、ruby単体で書いた復号処理を独立したメソッドにしましょう。
    PersonalLog(personal_logsテーブル)に、logid, dataの2つのカラムがあるという事でいいんですよね?

    キャンセル

  • 2018/07/17 11:34

    はいそのとおりです!

    キャンセル

  • 2018/07/17 11:35

    いい名前が思いつかなかったので、decryptedとしてPersonalLogモデルにメソッドを追加しました。
    レコードがある状態で、
    bin/rails consoleを起動し、
    record = PersonalLog.first
    record.decrypted(record.logid, record.data)
    と打ったら、復号処理が正しく動きますでしょうか。

    キャンセル

  • 2018/07/17 11:46

    復号処理しっかり動いております!

    キャンセル

  • 2018/07/17 11:48 編集

    では、decryptedをdecrypted_dataに統合します。
    モデル内では、自身のカラムをself.xxxで参照できるので、self.logid, self.dataを使うだけです。
    回答を修正しました。

    bin/rails consoleで以下が動くはずです。
    record = PersonalLog.first
    puts record.decrypted_data

    また、ビューも動作すると思います。

    キャンセル

  • 2018/07/17 12:23

    無事うまく動きました(泣)
    本当に本当にありがとうございます!!!
    初心者にも関わらず丁寧に回答して頂きありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.50%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Ruby

    7684questions

    Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

  • Ruby on Rails

    7282questions

    Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

  • MySQL

    5860questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • OpenSSL

    108questions

    OpenSSLはSSL/TLSのプロトコルと一般的な暗号のライブラリを導入するオープンソースのソフトウェアのツールキットです。