回答編集履歴
15
指摘部分を混乱防ぐために削除
test
CHANGED
@@ -1,34 +1,12 @@
|
|
1
|
+
$url_textと$paramが不一致なのが問題なのでは?
|
2
|
+
|
3
|
+
|
4
|
+
|
1
5
|
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyはベクトルを使うための共通鍵、$ivは暗号化と復号に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
|
2
6
|
|
3
7
|
|
4
8
|
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
```php
|
10
|
-
|
11
|
-
//$key = hash('sha256', Configure::read("OPEN_SSL_KEY")); //毎回変わってしまう
|
12
|
-
|
13
|
-
$cipher = 'aes-256-cbc';
|
14
|
-
|
15
|
-
//$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
|
16
|
-
|
17
|
-
$options = 0;
|
18
|
-
|
19
|
-
$encrypt = str_replace(array('~','-', '.'), array('+', '/', '='), $param);
|
20
|
-
|
21
|
-
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
22
|
-
|
23
|
-
```
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
$key、$ivともに暗号化、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、復号の際にはハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
9
|
+
この暗号化の2つの関数の相関性を説明すると
|
32
10
|
|
33
11
|
|
34
12
|
|
@@ -52,14 +30,8 @@
|
|
52
30
|
|
53
31
|
|
54
32
|
|
55
|
-
|
33
|
+
## 昨日のコメント
|
56
34
|
|
57
35
|
|
58
36
|
|
59
|
-
$共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
60
|
-
|
61
|
-
|
37
|
+
昨日のコメントは今後混乱を招く可能性があるので、一部削除しました。
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
14
復号の際は不要
test
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
27
|
+
$key、$ivともに暗号化、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、復号の際にはハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
28
28
|
|
29
29
|
|
30
30
|
|
13
これでわかるか
test
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyは共通鍵、$ivは暗号
|
1
|
+
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyはベクトルを使うための共通鍵、$ivは暗号化と復号に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
|
2
2
|
|
3
3
|
|
4
4
|
|
@@ -24,7 +24,7 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を
|
27
|
+
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を生成**しています。なので、**同じ暗号化対象対象の文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、共通鍵のキーワードも毎回ハッシュ化していると、値が別物になってしまっています。
|
28
28
|
|
29
29
|
|
30
30
|
|
@@ -42,7 +42,11 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで
|
45
|
+
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでベクトルを使用するためのものであって、暗号化に用いるベクトルそのものとは別物です。
|
46
|
+
|
47
|
+
|
48
|
+
|
49
|
+
要は共通鍵はその部屋で作業するための鍵、ベクトルはその鍵を開けた部屋で暗号化、復号するためのアイテムです。
|
46
50
|
|
47
51
|
|
48
52
|
|
12
更に補足の補足
test
CHANGED
@@ -24,9 +24,7 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
28
|
-
|
29
|
-
|
27
|
+
$key、$ivともに暗号、復号のたびにハッシュ化してしまうと、値が別物になってしまいますので、ハッシュ化不要です。**hash関数は毎回毎回ランダムで文字列を取得**しています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。無論、これだと共通鍵のキーワードも毎回ハッシュ化しているために、値が別物になってしまっています。
|
30
28
|
|
31
29
|
|
32
30
|
|
@@ -54,7 +52,7 @@
|
|
54
52
|
|
55
53
|
|
56
54
|
|
57
|
-
$共通鍵に入れるキーワードは暗号化
|
55
|
+
$共通鍵に入れるキーワードは暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
58
56
|
|
59
57
|
なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
|
60
58
|
|
11
keyもですね
test
CHANGED
@@ -1,14 +1,14 @@
|
|
1
|
-
openssl_encrypt関数とopenssl_decrypt関数に入れる$ivは暗号解読に用いるベクトルなので、復号も同じ値である必要があります。
|
1
|
+
openssl_encrypt関数とopenssl_decrypt関数に入れる$keyは共通鍵、$ivは暗号解読に用いるベクトルなので、暗号化(encrypt)、復号時(decrypt)とも同じ値である必要があります。
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
なので
|
5
|
+
なので2箇所のハッシュ化部分をコメントアウトしてください。
|
6
6
|
|
7
7
|
|
8
8
|
|
9
9
|
```php
|
10
10
|
|
11
|
-
$key = hash('sha256', Configure::read("OPEN_SSL_KEY"));
|
11
|
+
//$key = hash('sha256', Configure::read("OPEN_SSL_KEY")); //毎回変わってしまう
|
12
12
|
|
13
13
|
$cipher = 'aes-256-cbc';
|
14
14
|
|
10
bintohex
test
CHANGED
@@ -60,4 +60,4 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
63
|
+
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bintohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
9
ベクトルについて
test
CHANGED
@@ -36,9 +36,9 @@
|
|
36
36
|
|
37
37
|
```
|
38
38
|
|
39
|
-
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号
|
39
|
+
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは暗号化に用いる)
|
40
40
|
|
41
|
-
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号
|
41
|
+
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号用のベクトル、ここでは復号に用いる)
|
42
42
|
|
43
43
|
```
|
44
44
|
|
@@ -60,4 +60,4 @@
|
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
あとベクトル
|
63
|
+
あとベクトル作成に用いるハッシュはエンコードの関係で文字が化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
8
更に補足
test
CHANGED
@@ -26,7 +26,7 @@
|
|
26
26
|
|
27
27
|
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
28
28
|
|
29
|
-
それに、**hash関数は
|
29
|
+
それに、**hash関数は毎回毎回ランダムで文字列を取得**し、それをベクトルとしています。なので、**同じ文字列でもベクトルがランダムに変化している**ために、暗号化された文字列も毎回ランダムに変化します。
|
30
30
|
|
31
31
|
|
32
32
|
|
@@ -44,7 +44,7 @@
|
|
44
44
|
|
45
45
|
|
46
46
|
|
47
|
-
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
47
|
+
なので**共通鍵、暗号解読用のベクトルは文字列の暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
48
48
|
|
49
49
|
|
50
50
|
|
@@ -54,10 +54,10 @@
|
|
54
54
|
|
55
55
|
|
56
56
|
|
57
|
-
$
|
57
|
+
$共通鍵に入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
58
58
|
|
59
|
-
なので**ハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、使わない方が無難です。
|
59
|
+
なので**共通鍵にハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、データ管理が困難になり使わない方が無難です。
|
60
60
|
|
61
61
|
|
62
62
|
|
63
|
-
あと
|
63
|
+
あとベクトルは勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。数値ならエンコードに干渉されないし、DBテーブルにも格納しやすいからです。
|
7
そもそも、なぜ勘違いがおきたか
test
CHANGED
@@ -26,6 +26,8 @@
|
|
26
26
|
|
27
27
|
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
28
28
|
|
29
|
+
それに、**hash関数は同じ文字列でも同じ暗号にならずに、毎回毎回ランダムで文字列を取得**します。なので、**同じ文字列でも暗号化ベクトルがランダムに変化する**ために、暗号化された文字列も毎回ランダムに変化します。
|
30
|
+
|
29
31
|
|
30
32
|
|
31
33
|
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
@@ -42,7 +44,7 @@
|
|
42
44
|
|
43
45
|
|
44
46
|
|
45
|
-
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで
|
47
|
+
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまでシステム内で暗号化と復号を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
46
48
|
|
47
49
|
|
48
50
|
|
6
更に補足
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
なので**共通鍵、暗号解読用のベクトル
|
45
|
+
なので**共通鍵、暗号解読用のベクトル暗号化時と復号時に一致**していないと復号できません。なお、共通鍵とベクトルが一致という意味ではなく、共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
46
46
|
|
47
47
|
|
48
48
|
|
5
なので
test
CHANGED
@@ -42,7 +42,7 @@
|
|
42
42
|
|
43
43
|
|
44
44
|
|
45
|
-
なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
45
|
+
なので**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
46
46
|
|
47
47
|
|
48
48
|
|
4
更に補足
test
CHANGED
@@ -24,7 +24,25 @@
|
|
24
24
|
|
25
25
|
|
26
26
|
|
27
|
-
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいます。
|
27
|
+
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいますので、ハッシュ化不要です。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
ちなみに、この暗号化の2つの関数の相関性を説明すると
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
```
|
36
|
+
|
37
|
+
暗号化された文字列 = openssl_encrypt(対象の文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
38
|
+
|
39
|
+
対象の文字列 = openssl_decrypt(暗号化された文字列,暗号の種類,共通鍵,暗号の制御形式,暗号解読用のベクトル)
|
40
|
+
|
41
|
+
```
|
42
|
+
|
43
|
+
|
44
|
+
|
45
|
+
なの**共通鍵、暗号解読用のベクトルは一致**していないと復号できません。共通鍵はあくまで対象文字列を結びつけるものであって、暗号化に用いるベクトルとは別物です。
|
28
46
|
|
29
47
|
|
30
48
|
|
@@ -36,7 +54,7 @@
|
|
36
54
|
|
37
55
|
$keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
38
56
|
|
39
|
-
なので**ハッシュを使うと毎回キーワードが変わってしまう**ので、使
|
57
|
+
なので**ハッシュを使うと、同じ文字列でも毎回対応のキーワードが変わってしまう**ので、使わない方が無難です。
|
40
58
|
|
41
59
|
|
42
60
|
|
3
ベクトル
test
CHANGED
@@ -1,4 +1,36 @@
|
|
1
|
+
openssl_encrypt関数とopenssl_decrypt関数に入れる$ivは暗号解読に用いるベクトルなので、復号も同じ値である必要があります。
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
なので
|
6
|
+
|
7
|
+
|
8
|
+
|
9
|
+
```php
|
10
|
+
|
11
|
+
$key = hash('sha256', Configure::read("OPEN_SSL_KEY"));
|
12
|
+
|
13
|
+
$cipher = 'aes-256-cbc';
|
14
|
+
|
15
|
+
//$iv = substr(hash('sha256', Configure::read("OPEN_SSL_IV")), 0, 16); //毎回変わってしまう
|
16
|
+
|
17
|
+
$options = 0;
|
18
|
+
|
19
|
+
$encrypt = str_replace(array('~','-', '.'), array('+', '/', '='), $param);
|
20
|
+
|
21
|
+
$decrypt = openssl_decrypt($encrypt, $cipher, $key, $options, $iv);
|
22
|
+
|
23
|
+
```
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
$ivはハッシュ化してしまうと、ベクトルの値が別物になってしまいます。
|
28
|
+
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
|
1
|
-
やり方が
|
33
|
+
そもそも、やり方がよくないです。
|
2
34
|
|
3
35
|
|
4
36
|
|
@@ -8,4 +40,4 @@
|
|
8
40
|
|
9
41
|
|
10
42
|
|
11
|
-
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたり化けたりします。そのためには`bitohex`関数
|
43
|
+
あとハッシュをDBに格納したりするなら、文字列制限に注意してください。勝手に文字がカットされたりエンコードの関係で化けたりします。そのためには`bitohex`関数と`hextobin`関数を使ってハッシュを数値化した方が無難です。
|
2
理由
test
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
$keyに入れる
|
5
|
+
$keyに入れるキーワードは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
6
6
|
|
7
|
-
|
7
|
+
なので**ハッシュを使うと毎回キーワードが変わってしまう**ので、使ってはいけません。
|
8
8
|
|
9
9
|
|
10
10
|
|
1
暗号に修正
test
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
|
3
3
|
|
4
4
|
|
5
|
-
$keyに入れるのは暗号化したハッシュではなく、暗号と
|
5
|
+
$keyに入れるのは暗号化したハッシュではなく、暗号化用と復号用の共通の合言葉となる文字列です。
|
6
6
|
|
7
7
|
だから'生麦生米生卵'とかでもいいですが、それを見つからない場所に置いたりします。
|
8
8
|
|