SQLServer2005を使ったデータの暗号化について

このQ&Aのポイント
  • SQLServer2005を使用してデータを暗号化する方法について教えてください。
  • データベースに暗号化されたレコードを複数行登録しましたが、一部の行が複合化できずにNULLとして表示されます。この現象の原因について分かりますか?
  • 鍵の作成方法としては、CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'KeyPass'とCREATE SYMMETRIC KEY DES_KEY WITH ALGORITHM = DES ENCRYPTION BY PASSWORD = 'KeyPass'を使用しました。
回答を見る
  • ベストアンサー

データの暗号化について

SQLServer2005を使っての暗号化について教えて下さい。 次のコードを実行し、暗号かされたレコードを複数行登録します。 (データベースを直接覗いてみるとうまく暗号化されて登録はされております) OPEN SYMMETRIC KEY DES_KEY DECRYPTION BY PASSWORD = 'KeyPass'; INSERT INTO ANGOU_TEST ( NAME_SEI, NAME_MEI ) VALUES ( EncryptByKey(Key_GUID('DES_KEY'), '1'), EncryptByKey(Key_GUID('DES_KEY'), '1') ) その後SELECT文で複合をして表示すると、NULLとして表示される行がまれにあるのです。 (うまく行かない行とうまく行く行がまばらに出来てしまうのです...) OPEN SYMMETRIC KEY DES_KEY DECRYPTION BY PASSWORD = 'KeyPass'; SELECT CAST(DecryptByKey(NAME_SEI) AS VARCHAR(64)) AS NAME_SEI, CAST(DecryptByKey(NAME_MEI) AS VARCHAR(64)) AS NAME_MEI FROM ANGOU_TEST ちなみに、鍵は次のような方法で作りました。 CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'KeyPass' CREATE SYMMETRIC KEY DES_KEY WITH ALGORITHM = DES ENCRYPTION BY PASSWORD = 'KeyPass' なぜこのような現象が起きてしまうのかご教授お願いします。

noname#68099
noname#68099

質問者が選んだベストアンサー

  • ベストアンサー
  • aruko5963
  • ベストアンサー率100% (1/1)
回答No.1

データの暗号化について上手くいって無いようですね。 EncryptByKeyおよびDecryptByKeyの関数仕様は熟読しましたか? テーブル定義で暗号化対象のカラムの型はどのようになっていますか? EncryptByKeyの戻り値の型がvarbinary 型である事を考慮して見直してみては如何でしょうか?

参考URL:
http://msdn.microsoft.com/ja-jp/library/ms174361.aspx
noname#68099
質問者

お礼

テーブル定義varchar型でした、varbinary型(MAX)にする事で解決出来ました、ありがとうございました!

関連するQ&A

  • 暗号化したDBのデータ移行

    SQLServer2005Expressを使用して暗号化したデータベースのデータを他のPCへ移行しようとしております。 いろんなサイトを参考に下記の手順にてデータを移行しようとしております。 (1)データのバックアップ (2)Backup Certificate aaaaa to file = 'c:\aaa.cer' with private key (file = 'c:\xxx.pvk'',encryption by password = 'xxxxx') (3)新PCへマスターキーの作成 (4)Create Certificate aaaaa From file = 'c:\aaa.cer' with private key (file='c:\xxx.pvk',decryption by password= 'xxxxx') (5)データのリストア リストア後、既存のプログラムを実行したところ、下記のコマンドを実行した場合に“この操作を実行するには、マスターキーをデータベースに作成するか、またはセッション内のマスターキーを開いてください” とメッセージが出力されます。 "OPEN SYMMETRIC KEY aaaaaaaa DECRYPTION BY CERTIFICATE xxxxxxxxxxx" どこがいけないのでしょうか? 非常に困っています。 よろしくお願いいたします。

  • グループ化したいのですが

    テーブルAに以下のような項目があります。 [ID][SEI][MEI] やりたい事は、 ・[ID]ごとにグループ化して1行にまとめたい。 ・[SEI]と[MEI]をつなげて1つの項目として表示させたい。 これを実現させるには、どういうSQLを書けば良いでしょうか? 私が試したのは、以下のSQL文です。 SELECT ID,MIN(SEI) + MIN(MEI) AS NAME FROM TABLEA GROUP BY ID でも、これだと同じIDが複数存在すると[SEI][MEI]が別人のものがくっついてしまいます。当然ですが。 グループ化する前に[SEI][MEI]を連結させる処理が必要なのだろうと思うのですが、それをどうすれば良いのかが分かりません...。 どうかよろしくお願いします。m(_ _)m

  • グループ化したいのですが

    テーブルAに以下のような項目があります。 [MAIL_ID][SEND_DATE][USER_ID] テーブルBに以下のような項目があります。 [USER_ID][SEI][MEI] やりたい事は、 ・テーブルAとBを[USER_ID]をキーにして結合させたい。 ・テーブルAの[MAIL_ID]ごとにグループ化して1行にまとめたい。 ・テーブルBの[SEI]と[MEI]をつなげて1つの項目として表示させたい。 これを実現させるには、どういうSQLを書けば良いでしょうか? 私が試したのは、以下のSQL文です。 SELECT A.MAIL_ID, MIN(A.SEND_DATE) AS SEND_DATE,MIN( A.USER_ID) AS USER_ID,MIN(B.SEI) + MIN(B.MEI) AS ATESAKI FROM TABLEA A INNER JOIN TABLEB B ON A.USER_ID = B.USER_ID WHERE A.SEND_ID = '900001' GROUP BY A.MAIL_ID でも、これだと同じMAIL_IDが複数存在すると[SEI][MEI]が別人のものがくっついてしまいます。当然ですが。 グループ化する前に[SEI][MEI]を連結させる処理が必要なのだろうと思うのですが、それをどうすれば良いのかが分かりません...。 どうかよろしくお願いします。m(_ _)m

  • 英語の訳が分からない文章があります。

    英語の訳が分からない文章があります。 セキュリティの記事を取り扱っているサイトの、 コンピュータのデータの暗号化についての記事です。 Secret Key Algorithm A secret key algorithm (sometimes called a symmetric algorithm) is a cryptographic algorithm that uses the same key to encrypt and decrypt data. The best-known algorithm is the U.S. Department of Defense's Data Encryption Standard (DES). DES, which was developed at IBM in 1977, was thought to be so difficult to break that the U.S. government restricted its exportation. A very simple example of how a secret key algorithm might work might be substituting the letter in the alphabet prior to the target letter for each one in a message. The resulting text - "gdkkn," for example - would make no sense to someone who didn't know the algorithm used (x-1), but would be easily understood by the parties involved in the exchange as "hello." この文章の中の一番最後の「but would be easily understood by the parties involved in the exchange as "hello."」という文章の訳がわかりません。 私が訳した感じだと、「しかし、helloとして交換を含む人々によってそれは簡単に理解することができる」という感じになり、よくわかりません。 partiesやinvolved in、exchangeの訳が間違っているのだと思いますが、 よくわかりません。 どなたかご教授して頂きたいと存じます。 宜しくお願い致します。

  • JDBCを使ってdate型へのINSERTはできますか?

    JDBCを使ってOracleへ接続し、DBへデータを挿入したいのですが、 日付型のデータがどうしてもうまく挿入できません。 jsp + Servlet + Bean で開発しています。 使っているテーブルは CREATE TABLE USERS (     USERID     VARCHAR2(10) NOT NULL,     PASSWORD  VARCHAR2(10) NOT NULL,     NAME      VARCHAR2(50) NULL,     SEX       VARCHAR2(5)  NULL,     BIRTHDAY   DATE       NULL,     PRIMARY KEY (USERID, PASSWORD) ) という風な型で、定義しています。 DBへのINSERT処理は、Beanで行っています。 以下のINSERT文を実行したのですが、うまくINSERTできませんでした。 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX, BIRTHDAY)" + "VALUES ('use', 'pass', 'ナマエ', '女性', '1980/06/05')" int numOfUpdate = statement.executeUpdate(sqlQuery); ちなみに、この中のdate型で定義している「BIRTHDAY」を除いたINSERT文 String sqlQuery = "INSERT INTO USERS (USERID, PASSWORD, NAME, SEX)" + "VALUES ('use', 'pass', 'ナマエ', '女性')" int numOfUpdate = statement.executeUpdate(sqlQuery); だとうまくINSERTできます。 sql*plusを使って直に書くと、両方うまくINSERTできました。 ●その後に、「BIRTHDAY」をdate型からVARCHAR2(10)へ定義し直し、  DBを作り直して実行した所、うまくINSERTできるようになりました。 なぜ「date型」だとINSERTできず、「VARCHAR2型」だとINSERTできるのか、 知っている方がおられましたら、ぜひ教えて頂きたいです。

    • ベストアンサー
    • Java
  • LOAD DATA INFILE でエラー起きてデータを一括してロードできません。

    はじめまして。 質問があります。 現在WindowsXP Home、MySQL5.0.27を使用しているのですが、 テキストファイルのデータを一括でDBにロードしようとすると、 エラーが起きてしまいます。 ------------------------ Demo01.txt -------------------------- 1,あああ 2,いいい 3,ううう ------------------------ Demo01.sql --------------------------- create table test ( no integer not null, name varchar(30), primary key(no) )type=InnoDB; ---------------------------------------------------------------- mysql> load data low_priority infile 'C:/Demo01.txt' -> replace -> into table test -> fields terminated by ',' -> lines terminated by '/r/n' -> escaped by '\\'; ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use : 'escaped by '\\'' 付近: 6 行目 ---------------------------------------------------------------- 上記のようなエラーが出てしまいますので、試しにescaped by '\\' を削除して実行すると、 ---------------------------------------------------------------- Query OK, 1 row affected (0.09 sec) レコード数: 1 削除: 0 Skipped: 0 Warnings: 0 ---------------------------------------------------------------- と表示され1行しかロードできません。どうしたら全行をロードするこ とができるのでしょうか?どうかご教授お願いします。

    • ベストアンサー
    • MySQL
  • PHPからMySQLのデータが表示できない

    〇質問の主旨 PHPでMySQLのデータベース(テーブル)から データを表示させようと考えていて、 一度目は表示させることはできました。 しかし同じURLでブラウザをリロードしたところ、 二度目は表示されません。 もう一度データを表示させるためには、 どのあたりをチェックすればよいでしょうか? ご存知の方がいらっしゃいましたら、 ご教示願います。 〇質問の補足 PHPによるコードとMySQLによるクエリ文は次のとおりです。 現在、PHPの「処理1」にある"Success!"は表示させることができますが、 「処理2」は表示させることはできません。 ・コード <?php // データベースの接続 try { $dbh = new PDO('mysql:host=localhost;dbname=mydatabase', 'myname','mypassword'); } catch(PDOException $e) { var_dump($e->getMessage()); exit; } // 処理 1 echo "Success!"; // 処理 2 $sql = "select * from users"; $stmt = $dbh->query($sql); foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $user) { var_dump($user['name']); } echo $dbh->query("select count(*) from users")->fetchColumn() . "records found"; // 切断 $dbh = null; ・クエリ文 create table users ( id int(11) not null auto_increment primary key, name varchar(50), email varchar(255) unique, password char(16) ); insert into users (name,email,password) values ('hoge','hoge@dummy.com','abc'); insert into users (name,email,password) values ('foo','foo@dummy.com','def'); 以上、よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • カラム名の付け方について

    このジャンルでお願いします。 例えば次のようなアカウント情報を格納するテーブルがあったとして CREATE TABLE user (  id int(11) NOT NULL AUTO_INCREMENT,  name varchar(64),  email varchar(64),  password varchar(64),  PRIMARY KEY(id) ); idカラム名を「id」か「user_id」にするか悩んでいます。 自分としては「id」のままで良いと思っているのですが、 参考書や他の方のやり方を見てると「user_id」のようにしてる方もいます。 「user_id」にすることによってSQL文を見た時にも何のidかすぐ分かるし、 USING句を使えるなどのメリットがあるのでたしかにこちらの方が良いかなぁとは思うのですが、 「user_id」にするなら統一性をもたせるために「name」も「user_name」にするのか、 「email」も「user_email」にするのか、などキリがないというか・・・ そういう理由もあって自分としては「id」のままなのですが、 みなさんはどちらのやり方をされているのでしょうか?

  • csvファイルの読み込みとOracleDBへの更新

    VB6.0とOracle9i、どちらも初心者です。 C:\直下にあるtest.csvファイルを読み込み、Oracleのテーブルと比較して存在しないものはinsert、存在するものはupdateする。 ・test.csvファイル(百行) "LOCATE", "COMPANY_CODE", "COMPANY_NAME", "COMPANY_KANA", "ZIPCODE", "ADDRESS", "TEL_NO", "FAX_NO", "CATEGORY", "INDUSTRIES", "PERSONS" ・OracleのCustomerテーブル COMPANY_CODE NUMBER COMPANY_NAME VARCHAR2 COMPANY_KANA VARCHAR2 ZIPCODE CHAR ADDRESS VARCHAR2 TEL_NO CHAR TEL_NO_2 CHAR FAX_NO CHAR HP_URL VARCHAR2 NOTE VARCHAR2 CUST_VARCHAR_1 VARCHAR2 CUST_VARCHAR_2 VARCHAR2 CUST_VARCHAR_3 VARCHAR2 CUST_VARCHAR_4 VARCHAR2 ・ロジック 1.oo4oでOracleに接続 2.csvファイルの読み込み 3.oracleのレコードとの比較 4.insertプログラム 5.updateプログラム ・コード '** oo4o 接続 dbname = "****" cnuser = "****/****" Set OraSession = CreateObject("OracleInProcServer.XOraSession") Set OraDatabase = OraSession.OpenDatabase(dbname, cnuser, ORADB_DEFAULT) Open "c:\test.csv" For Input As #1 ' csvファイルをオープンして、1行ずつループで取り込んで、取り込んだcsvレコード(行)を元にキー項目(COMPANY_CODE)を条件に既にOracleテーブルにあればInsertクエリを, なければUpdateクエリを発行する、をファイルエンドまで繰り返します。 自分でなんとか書いて聞くのが礼儀だと思いますが、調べてもやっぱりどう書けばよいのか全くわかりません。懸念事項として、Oracleのテーブルの列とCSVの列の数や並び方が異なっていることがあります。よろしくお願いします。

  • pearの認証(Auth)ができません。

    下記のサイトを参考にして認証サンプルを作成しました。 http://blueeyesblue.cocolog-nifty.com/technote/2007/09/pearauthmdb2-e2.html 下記のコマンドを実行してインストール済みかを確認しました。 pear list -------------------------------------------------- Auth 1.6.4 stable MDB2 2.5.0b3 beta MDB2で正常にデータベースに接続できるかを確認しました。 問題なく接続できました。 下記のテキストボックスに値を入力して[Login]ボタンをクリックしたら下記のエラーが出力されました。 ・Username ・Password ※ログイン画面はAuthのデフォルト画面を使用しています。 [エラー] login failed テーブルは下記のように作成しています。 CREATE TABLE TBL_USER (  no BIGSERIAL PRIMARY KEY,  name VARCHAR(64) NOT NULL,  mail VARCHAR(128) NOT NULL,  password VARCHAR(128) NOT NULL,  del VARCHAR(1) DEFAULT '0' NOT NULL,  ins_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  ins_name VARCHAR(64) NOT NULL,  upd_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP,  upd_name VARCHAR(64) NOT NULL ); ※テーブルのpasswordフィールドに格納している値は下記のように生成して追加しました。 mkpasswd -l 7 php -r 'echo md5(*******);' ※md5に指定している値はmkpasswdで出力された値を指定しました。 サンプルコードは下記の個所のみを変更しました。 $options = array(  "dsn" => "pgsql://ユーザー名:パスワード@localhost/データベース名",  "table" => "TBL_USER",  "usernamecol" => "name",  "passwordcol" => "password", ); 正直、何が原因なのかわからず困っています。 どうかご存知の方がいましたらアドバイスいただけませんでしょうか。 また今まで認証は1から自作していましたがpearの認証は使いやすいみたいな記事を読んだので使用しようと思いましたが・・・ 自作の認証とpearの認証ではどちらがいいのでしょうか。 ご意見等、何でも構いませんので教えていただけませんでしょうか。 宜しくお願いします。

    • 締切済み
    • PHP