文字コードのエンコード・デコード処理がイマイチ理解できていないのが原因・・・。
デコード目的の一行 CryptoJS.enc.Utf8.stringify( tempText );
ここでの引数の形式に間違いが潜んでいるのでしょうか?
大変申し訳ございませんが、お教えください。
【目標】
①文字列を暗号化(名前や生年月日など)
②データベース(firebase)に保存(暗号化した文字列はキーやデータに使用)
③データベースから取得
④復号
【障害】
直接、暗号化→復号は可能(保存処理を介さなければ成功する)
①→④:成功
データベースへの保存・取得を介すると復号できず
①→②→③→④:失敗
【トライ】
firebaseのやり取りをsessionStorageに変更:☓
暗号・復号・エンコード・デコードの各処理後の文字列状況をモニタ
文字コードの判別
javascript
1 // 暗号化・複合テスト 2 textEncryptTest: function(){ 3 4 const Cipher = require('aes-ecb'); // npmでAES-ECB をインストール。使えるようにモジュール化 5 const CryptoJS = require("crypto-js"); // npmでcrypto-jsをインストール。使えるようにモジュール化 6 const TEXT_KEY = "********************************"; // 暗号化キー(AES-ECBの指定で16Byte) ※実際は文字列 7 const ENCODING = require('encoding-japanese'); 8 9 var tempText = "テスト1234XYZ"; 10 var resultEncoding = ENCODING.detect(tempText); 11 console.log('ソース:\n[' + tempText + ']\n<' + resultEncoding + '>'); 12 // ソース: 13 // [テスト1234XYZ] 14 // <UNICODE> 15 16 17 // 暗号化(ECBを使用。推奨はCBCだが、ECBにしないと毎回違う値になる。難読性程度で良いのでOKとする) 18 var tempText = Cipher.encrypt( TEXT_KEY, tempText ); 19 resultEncoding = ENCODING.detect(tempText); 20 console.log('AES_ECB_En:\n[' + tempText + ']\n<' + resultEncoding + '>'); 21 // AES_ECB_En: 22 // [JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=] 23 // <ASCII> 24 25 // UTF8でエンコード(暗号文の記号をなくすため。記号があるとデータベースのキーに使用できない。→ UTF8でエンコード) 26 tempText = CryptoJS.enc.Utf8.parse( tempText ); 27 resultEncoding = ENCODING.detect(tempText); 28 console.log('UTF8_En:\n[' + tempText + ']\n<' + resultEncoding + '>'); 29 // UTF8_En: 30 // [4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d] 31 // <ASCII> 32 33/*------------------------------------------------------------------------------------------------ 34 // ストレージに保存 35 sessionStorage.setItem( 'textEncryptTest', tempText ); 36 37 // ストレージから読み出し 38 tempText = sessionStorage.getItem( 'textEncryptTest' ); 39 tempText = String( tempText ); 40 resultEncoding = ENCODING.detect(tempText); 41 console.log('sessionStorage:\n[' + tempText + ']\n<' + resultEncoding + '>'); 42 // sessionStorage: 43 // [4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d] 44 // <ASCII> 45 ------------------------------------------------------------------------------------------------*/ 46 47 // UTF8をデコード 48 tempText = CryptoJS.enc.Utf8.stringify( tempText ); 49 resultEncoding = ENCODING.detect(tempText); 50 console.log('UTF8_De_s:\n[' + tempText + ']\n<' + resultEncoding + '>'); 51 // UTF8_De_s: 52 // [JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=] 53 // <ASCII> 54 55 // 復号 56 tempText = Cipher.decrypt(TEXT_KEY, tempText); 57 resultEncoding = ENCODING.detect(tempText); 58 tempText = tempText.trim(); 59 console.log('AES_ECB_De:\n[' + tempText + ']\n<' + resultEncoding + '>'); 60 // AES_ECB_De: 61 // [テスト1234XYZ] 62 // <UNICODE> 63 64 // 文字列最後に元ソース以外のコードが添付されていて、その長さが示されている。その分を削除する。 65 var lastCodeLength = Number( tempText.charCodeAt(tempText.length -1) * (-1) ); 66 tempText = tempText.slice(0, lastCodeLength); 67 resultEncoding = ENCODING.detect(tempText); 68 console.log('AES_ECB_De_Slice:\n[' + tempText + ']\n<' + resultEncoding + '>'); 69 // AES_ECB_De_Slice: 70 // [テスト1234XYZ] 71 // <UNICODE> 72 },
暗号文を、ストレージへの保存処理を挟むと復号できなくなる。
↓以下は保存処理〔有る・無し〕の挙動の違いです。
◆ストレージへの保存をしない場合(コメントアウトしたまま)のログ
ソース:
[テスト1234XYZ]
<UNICODE>
AES_ECB_En:
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<ASCII>
UTF8_En:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<ASCII>
UTF8_De_s:
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<ASCII>
AES_ECB_De:
[テスト1234XYZ]
<UNICODE>
AES_ECB_De_Slice:
[テスト1234XYZ]
<UNICODE>
◆ストレージへの保存をした場合のログ
ソース:
[テスト1234XYZ]
<UNICODE>
AES_ECB_En:
[JjZ6JnZrjWOBLCGiqAP3px0LyqEJfF4/6XsBCnVJr/0=]
<ASCII>
UTF8_En:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<ASCII>
sessionStorage:
[4a6a5a364a6e5a726a574f424c434769714150337078304c7971454a6646342f36587342436e564a722f303d]
<ASCII>
UTF8_De_s:
[]
<false>
AES_ECB_De:
[]
<false>
AES_ECB_De_Slice:
[]
<false>
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。