phpのopensslを使用して暗号化した場合に英数字のみに変換することは出来ますか
解決済
回答 1
投稿
- 評価
- クリップ 2
- VIEW 10K+
phpのopensslを使用して暗号化、複合化をしています。
暗号化のときに「aa+bb/cc==」のように記号が含まれてしまいます。
これを「aabbcc99」のように英数字のみで暗号化にすることは出来ますか。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+2
暗号化はこれ↓で行われているのでしょうか?
http://php.net/manual/ja/function.openssl-encrypt.php
aa+bb/cc==
おそらく base64 エンコードされているので、openssl_encrypt
の $options
で OPENSSL_RAW_DATA
を指定して、返されたバイナリデータを適当な別の方法でエンコードすれば良いと思います。例えば bin2hex
などです。
試していないですけれども、次のような感じでしょうか。
$encrypted = bin2hex(openssl_encrypt($data, $method, $password, OPENSSL_RAW_DATA, $iv));
複合は逆に hex2bin
を使います。
$decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA, $iv);
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.36%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2016/04/01 16:26
暗号化は
$encrypted = bin2hex(openssl_encrypt($data, $method, $password, OPENSSL_RAW_DATA))
で行い、複合化は
$decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA)
で問題ありませんでした。
$ivは無くてもできているので無いままかもしれません。
2016/04/01 16:46
を実行すると返却できませんでした。
データが長すぎると駄目だったりするんですかね?
2016/04/01 16:54
bin2hex によって本来のデータサイズの倍ぐらいになるので memory_limit にかかっているとか?
2016/04/01 16:58
echo $encrypted;
と見ると「aaabbb~」と変換された値が見えます。
$decrypted = openssl_decrypt(hex2bin($encrypted), $method , $password, OPENSSL_RAW_DATA)
上記の複合化後に
echo $decrypted;
を見ると何も表示されません。
echo $decrypted. "+";
とすると「+」だけ表示されます。
2016/04/01 17:00
2016/04/01 17:38
try {
ini_set( 'display_errors', 1 );
error_reporting(-1);
openssl_decrypt(~
例外が発生する
} catch(Exception $e) {
エラー画面に遷移
}
そのためエラー画面に遷移するため画面にエラーが表示されません。
また、ログには例外発生時の内容しか記載されていません。
そもそもこの記載が間違っていますかね?
2016/04/01 17:41
hex2bin($encrypted)
は正常に表示されます。
2016/04/01 17:44
2016/04/01 17:47
例外はopenssl_decryptとは違うところで発生しています。
openssl_decryptで返却した値をDBの検索条件に使用しており、DBから結果が取得できないため例外が発生しています。
2016/04/01 17:52
2. bin2hex や hex2bin をなくして動作するかどうかを確認する
2016/04/01 17:53 編集
2016/04/01 17:54
だと取得できていました。しかし、
openssl_decrypt(hex2bin($_GET['data'])~
だと取得できていませんでした。
GETとPOSTで変わったりしますか?
2016/04/01 17:55
2016/04/01 17:59 編集
2016/04/01 23:45
(パスワードをハードコーディングするとサーバを乗っ取れば誰でも復号できてしまうのでそもそもあまり暗号化する意味がなくなる)
2016/04/05 09:54
$_POSTで取得できる箇所は、取得できない箇所とは別の箇所です。
問題の箇所では$_POST、$_GETともに取得できませんでした。
2016/04/05 09:55
2016/04/05 10:13
bin2hexを使用せずに
openssl_encrypt($data)
で値を変換しました。
変換した値を
openssl_decrypt(~)
で元に戻すと上記と同じく取得できません。
2016/04/05 10:20
原因は
openssl_encryptのときにOPENSSL_RAW_DATAを指定せず、
openssl_decryptのときにOPENSSL_RAW_DATAを指定していました。
openssl_decryptでOPENSSL_RAW_DATAを指定すると、取得できるようになりました。
回答していただきありがとうございます。