web-dev-qa-db-ja.com

JavaScriptで文字列を難読化および難読化解除する最も簡単な方法

JavaScriptで文字列を難読化および難読化解除する方法を探しています。セキュリティが問題にならない場合の暗号化と復号化を意味します。関数を記述せずに「文字列を別の文字列に変換して再び戻す」ための、JS固有の何か(PHPのbase64_encode()base64_decode()など)が理想的です。

どんな提案も歓迎します!

32
Rich Jenks

btoa() および atob() を使用できます。 btoa()base64_encode()atob()のようなbase64_decode()のようなものです。

次に例を示します。

btoa('Some text'); // U29tZSB0ZXh0
atob('U29tZSB0ZXh0'); // Some text

これは秘密を保持する安全な方法ではないことに注意してください。 Base64は、バイナリデータを基数64表現に変換することにより、バイナリデータをASCII文字列形式で表す)からテキストへのエンコードスキームです。

64
Minko Gechev

それは注目に値する

(![]+[])[+[]]+(![]+[])[+!+[]]+([![]]+[][[]])[+!+[]+[+[]]]+(![]+[])[!+[]+!+[]]

文字列のように見えることなく、文字列「fail」に評価されます。真剣に、ノードに入力して驚かされます。クレイジーにすることで、JavaScriptで何でも綴ることができます。

16
GantMan

答えには明らかに手遅れですが、問題の別の解決策に取り組んでおり、base64は弱すぎるように見えました。

それはこのように動作します:

"abc;123!".obfs(13) // => "nopH>?@."
"nopH>?@.".defs(13) // => "abc;123!"

コード

/**
 * Obfuscate a plaintext string with a simple rotation algorithm similar to
 * the rot13 cipher.
 * @param  {[type]} key rotation index between 0 and n
 * @param  {Number} n   maximum char that will be affected by the algorithm
 * @return {[type]}     obfuscated string
 */
String.prototype.obfs = function(key, n = 126) {
  // return String itself if the given parameters are invalid
  if (!(typeof(key) === 'number' && key % 1 === 0)
    || !(typeof(key) === 'number' && key % 1 === 0)) {
    return this.toString();
  }

  var chars = this.toString().split('');

  for (var i = 0; i < chars.length; i++) {
    var c = chars[i].charCodeAt(0);

    if (c <= n) {
      chars[i] = String.fromCharCode((chars[i].charCodeAt(0) + key) % n);
    }
  }

  return chars.join('');
};

/**
 * De-obfuscate an obfuscated string with the method above.
 * @param  {[type]} key rotation index between 0 and n
 * @param  {Number} n   same number that was used for obfuscation
 * @return {[type]}     plaintext string
 */
String.prototype.defs = function(key, n = 126) {
  // return String itself if the given parameters are invalid
  if (!(typeof(key) === 'number' && key % 1 === 0)
    || !(typeof(key) === 'number' && key % 1 === 0)) {
    return this.toString();
  }

  return this.toString().obfs(n - key);
};
10
enzian