带你学习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 , 但是生成的值更难预测了 , 就可以用于加密 。

推荐阅读