JS安全乱数window.cyptoとその互換性

5115 ワード

はJSでよく使用されているMath.Random()関数で乱数を生成しますが、この関数で発生した乱数は本物のランダム性を持たず、暗号化型はあまり強くありません.したがって、特定の暗号化性の高いセキュリティ乱数が必要な場合は、JSが提供するウィンドウズ.cyptoを用いて乱数を生成することができる.   Window.cypto読み取り専用属性は、グローバルオブジェクトに関連するCryptオブジェクトに戻ります.このオブジェクトは、いくつかの暗号化関連サービスにウェブページのアクセスを許可します.十分な性能を確保するために、真の乱数生成器を使用しないが、それらは十分なエントロピー値を有する擬似乱数生成器を使用している.使用しているPRNGの実装は他とは異なりますが、暗号化の用途に適しています.この実装には十分なエントロピーを有するシードを使用する必要がある.    cryptはできるだけhttps環境で使用します.そうでないとundefinedまたは空の対象関数に戻ります.Math.random():0(含まない)~1(含まない)の間のランダム数を返します.この関数は暗号化された安全な乱数生成器ではありません.window.cypto.get Random Values(typedAray):非0の正の整数を返します.Crypt.get Random Values(typedAray)方法は暗号学の安全性に要求されるランダム値を取得できます.typedArayは、Int 8 Aray、Uint 8 Aray、Int 16 Aray、Uint 16 Aray、Int 16 Aray、Int 32 Aray、またはUint 32 Arayとすることができる整数ベースのTypedArayである.生成した属技術はtypedAray配列に格納されます.
使用方法安全乱数を生成するだけで、下記のコードで使用できます.
  var arr = new Uint16Array(8);
  window.crypto.getRandomValues(arr);
  for (var i = 0; i < arr.length; i++) {
    console.log(arr[i]);
  }
ここで注意が必要です.window.cryptoは共通のブラウザで正常に動作するしかないです.もし互換性があるなら、下記のプレフィックスを使う必要があります.
  • webkitはChrome、Safari、Operaの新しいバージョンに対応しています.ほとんどのiOSブラウザ(iOS版のFirefoxを含みます.)基本的には、任意のWeb Kitベースのブラウザ
  • moz互換Firefox
  • o互換旧バージョン、WebKit前バージョン、およびOpera版
  • ms対応マイクロソフトのインターネットExplorerとMicrosoft Edge
  • したがって、フルバージョンの互換性を作るには、このような使い方が必要です.
      var arr = new Uint16Array(8);
      var crypto = window.crypto || window.webkitCrypto 
      			|| window.mozCrypto || window.oCrypto || window.msCrypto;
      window.crypto.getRandomValues(arr);
      for (var i = 0; i < arr.length; i++) {
        console.log(arr[i]);
      }
    
    セキュリティ乱数の生成に加えて、Windows.cyptoはデータを復号化するためのアルゴリズム(RSA-OAEP)のみが暗号化/復号をサポートしています.
  • は、公開秘密鍵ペアを生成する.crypt.subtle.generate Key
  • 公開鍵を導出する:window.cypto.subtle.export Ke
  • 公私鍵を導入する:window.cypto.subtle.import Key
  • 暗号化:window.cypto.subtle.wrapKey
  • 復号:window.cypto.subtle.unwrapKey
  • 署名:crypt.subtle.sign
  • 検札:crypt.subtle.verify
  • 暗号化明文:crypt.subtle.encrypt
  • 暗号文を解読する:crypt.subtle.decrypt
  • あまり使わないので、ここで具体的な用法を記録しないで、時間があったら詳しく説明してください.