帶你學習JavaScript中的File API、Streams API和Web Cryptography API( 二 )


五、File API和Blob API1、File類型File API仍然以表單中的文件輸入字段為基礎 , 但是增加了直接訪問文件信息的能力 。 HTML5在DOM上為文件輸入元素增加了files集合 。 當用戶在文件字段中選擇一個或多個文件時 , 這個files集合中會包含一組File對象 , 表示被選中的文件 , 每個File對象都有一些只讀屬性 。
2、FileReader類型FileReader類型表示一種異步文件讀取機制 , 可以把FileReader想象成類似于XMLHttpRequest , 只不過用于從文件系統讀取文件 , 而不是從服務器讀取數據 。 FileReader類型提供了幾個讀取文件數據的方法 。

    readAsText(file,encoding);//從文件中讀取純文本內容并保存在result屬性中
    readAsDataURL(file);//讀取文件并將內容的數據URI保存在result屬性中
    readAsBinaryString(file);//讀取文件并將每個字符的二進制數據保存在result屬性中
    readAsArrayBuffer(file);//讀取文件并將文件內容以ArrayBuffer形式保存在result屬性中
3、FileReaderSync類型FileReader類型的同步版本 。
4、Blob與部分讀取某些情況下 , 可能需要讀取部分文件而不是整個文件 , 為此 , File對象提供了一個名為slice()的方法 。 slice()方法接收兩個參數:起始字節和堯都區的字節數 。 這個方法返回一個Blob的實例 , 而Blob實際上是File的超類 。
blob表示二進制大對象 , 是JavaScript對不可修改二進制數據的封裝類型 。 包含字符串的數組、ArrayBuffers、ArrayBufferViews , 甚至其他Blob都可以用來創建blob 。 Blob構造函數可以接收一個options參數 , 并在其中指定MIME類型 。
六、Streams API1、應用場景Streams API 是為了解決一個簡單但又很基礎的問題而生的:Web應用如何消費有序的小信息塊而不是大塊信息?這種能力主要有兩種應用場景 。
    大塊數據可能不會一次性都可用 。 網絡請求的響應就是一個典型的例子 。 網絡負載是以連續信息包形式交付的 , 而流式處理可以讓應用在數據一到達就能使用 , 而不必等到所有數據都加載完畢 。 大塊數據可能需要分小部分處理 。 視頻處理、數據壓縮、圖像編碼和JSON解析都是可以分成小部分進行處理 , 而不必等到所有數據都在內存中再處理的例子 。
2、理解流Streams API定義了三種流:
    可讀流:可以通過某個公共接口讀取數據塊的流 。 數據在內部從底層源進入流 , 然后由消費者consumer進行處理 。
    可寫流:可以通過某個公共接口寫入數據塊的流 。 生產者(consumer)將數據寫入流 , 數據在內部傳入底層數據槽(sink) 。
    轉換流:由兩種流組成 , 可寫流用于接收數據 , 可讀流用于輸出數據 。 這兩個流質檢是轉換程序(transformer) , 可以根據需要檢查和修改流內容 。
七、Web Cryptography APIWeb Cryptography API描述了一套密碼學工具 , 規范了JavaScript如何以安全和符合慣例的方式實現加密 。 這些工具包括生成、使用和應用加密秘鑰對 , 加密和解密信息 , 以及可靠地生成隨機數 。
在需要生成隨機數時 , 很多人會使用Math.random() 。 這個方法在瀏覽器中是以偽隨機數生成器(PRNG , PseudoRandom Number Generator)方式實現的 。 所謂的偽指的是生成值的過程不是真的隨機 。 PRNG生成的值只是模擬了隨機的特性 。 瀏覽器的PRNG并未使用真正的隨機源 , 只是對一個內部狀態應用了固定的算法 。 每次調用Math.random() , 這個內部狀態都會被一個算法修改 , 而結果會被轉換為一個新的隨機數 。 例如 , V8引擎使用了一個名為xorshift128+的算法來執行這種修改 。
由于算法本身是固定的 , 其輸入只是之前的狀態 , 因此隨機數順序也是確定的 。 xorshift128+使用128位內部狀態 , 而算法的設計讓任何初始狀態在重復自身之前都會產生2128-1個偽隨機值 。 這種循環被稱為置換循環 , 而這個循環的長度被稱為一個周期 。 很明顯 , 如果攻擊者知道PRNG的內部狀態 , 就可以預測后續生成的偽隨機值 。 如果開發者無意中使用了PRNG生成了私有密鑰用于加密 , 則攻擊者就可以利用PRNG的這個特性算出私有密鑰 。
偽隨機數生成器主要用于快速計算出看起來隨機的數 , 不過并不適合用于加密算法 , 為解決這個問題 , 密碼學安全偽隨機數生成器(CSPRNG , Cryptographically Secure PseudoRandom Number Generator),額外增加了一個熵作為輸入 , 例如測試硬件時間或其它無法預計行為的系統特性 , 雖然速度上不及PRNG , 但是生成的值更難預測了 , 就可以用于加密 。

推薦閱讀