加入收藏 | 设为首页 | 会员中心 | 我要投稿 厦门网 (https://www.xiamenwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 业界 > 正文

前端该知道些密码学和安全上的事儿

发布时间:2019-01-18 01:14:08 所属栏目:业界 来源:五溪
导读:今年至少有六个月的时间在和密码学,安全,隐私上的事情打交道,很有必要为今年总结一篇收官之作,整篇文章会描述一些基础概念,以及我力所能及的一些理解,这份知识很有可能不准确,主要让前端的同学们有一些概念,知道有这么回事,大佬轻拍; 密码学浅识
副标题[/!--empirenews.page--]

今年至少有六个月的时间在和密码学,安全,隐私上的事情打交道,很有必要为今年总结一篇收官之作,整篇文章会描述一些基础概念,以及我力所能及的一些理解,这份知识很有可能不准确,主要让前端的同学们有一些概念,知道有这么回事,大佬轻拍;

前端该知道些密码学和安全上的事儿

密码学浅识

在密码学的世界里加密之前的消息被称为明文 plaintext,加密之后的消息被称为密文ciphertext,如果一段密文需要被解密再阅读,这个过程被称之为 decrypt,反之一段plaintext 需要被加密,这个过程被称之为 encrypt。那么在处理这些问题的过程(解决加密/解密的步骤)通常被称之为 算法,加密算法和解密算法被组合起来叫 密码算法。

目前我个人所接触到的主要是:

  • 对称密码
  • 单向散列函数
  • 非对称密码
  • Web Crypto API

其中对于公钥证书的数字签名等等。别着急,这些概念性的内容可能会非常的枯燥,因此我并不会描述很多,反而从实际性的问题出发,举例在前端的领域中,上述三个方向上着重解决什么问题。

  • https://code.google.com/archive/p/crypto-js/
  • https://github.com/brix/crypto-js
  • https://github.com/PeculiarVentures/PKI.js
  • https://developer.mozilla.org/zh-CN/docs/Web/API/Web_Crypto_API

对称密码

比较典型的如 AES ,它是指在加密和解密的过程中使用同一个 密钥 的处理这个过程。我们知道,目前在中国大陆的Web世界中(不仅是Web也包括App),二维码的流行程度几乎很多场景里都有使用,这种不经过网络的直接获取数据,非常适合使用这种对称加密/解密的方式来传输数据,前端这边会使用 crypto-js 来处理 AES,这个 Google 开源的库支持 AES-128,AES-192,AES-256:

  1. import * as CryptoJS from "crypto-js"; 
  2.  
  3. export function aesDecrypt(text, originKey){ 
  4.   const bytes = CryptoJS.AES.decrypt(text, originKey); 
  5.   return bytes.toString(CryptoJS.enc.Utf8); 
  6.  
  7. export function aesEncrypt(text, originKey){ 
  8.   const c = CryptoJS.AES.encrypt(text, originKey); 
  9.   return c.toString(); 

单向散列函数

这个函数如果要举例的话比较典型的有我们下载任何软件包时同时会校验一下MD5值来防止下载的软件包是一个被篡改的软件包。单向散列函数就是为了计算散列值而准备的函数,crypto-js包中不仅提供了 md5,hmac 也有 sha256 。如果有一天前端和服务端约定要对数据进行校验,当然最简单的方式是 md5 ,但这已经是一种不安全的计算了,最好使用 sha256:

  1. import * as CryptoJS from "crypto-js"; 
  2.  
  3. const sha256 = CryptoJS.algo.SHA256.create(); 
  4.  
  5. sha256.update("Message Part 1"); 
  6. sha256.update("Message Part 2"); 
  7. sha256.update("Message Part 3");  
  8.   
  9. const hash = sha256.finalize(); 

非对称密码

密码学的那本书里讲了很多密钥分配的问题,这种思考确实...很烧脑,不过这种前辈经历过的思考,在我们的实际应用中其实会有一个很有趣的过程。非对称密码,就是将密钥分了两个部分:加密密钥和解密密钥,发送者使用加密密钥对消息进行加密,接收者使用解密密钥进行解密。在这里加密密钥是可以被公开的,只有解密密钥是绝对不能被公开的。那么这其中使用了什么样的算法来生成密钥对(说实话,我也不是很清楚,因为没看懂),但前端的同学们了解到非对称密码还是很有必要。对于加密密钥它被称之为 `public key`,对应的解密密钥被称之为 `private key`,目前被广泛使用的公钥密码算法叫做 `RSA`。

除了加密之外,非对称密码还可以解决身份认证的问题,想一想如果有人伪装了一个和你一样的微信,同样的头像和昵称,同样的说话语气,诈骗集团极有可能因此从你处获取到真正的经济利益。因为非对称密码的公钥是可以公开的,一个人对应一个公钥,在密码的世界里,根本无法伪装,因为无法解密也无法得到认证。

我想如果你会写 Web 版的区块链钱包或者钱包,非对称密码的使用频率还是相当高的,除此之外它所在的场景会特别的特殊(前端而言),不过如果在其他的领域,会比较常见。

Web Crypto API

Web Crypto API 为脚本提供加密了一套关于密码(学)的接口,以便用于构建需要使用密码的系统。这套API的基础特性是允许在脚本中使用和维护密钥的存储,但是不允许使用JavaScript访问这些密钥本身。

Web Crypto API 必须在 HTTPS 网页中才能被使用(Chrome)

这套接口允许脚本使用以下功能:

  • digest, 摘要,即计算数据块hash的能力,用于检测数据的变动。
  • mac, 计算消息验证码的能力。
  • sign and verify, 对文档进行数字签名和验证的能力。
  • encrypt and decrypt, 对文档进行加密和解密的能力。
  • import and export, 导入和导出密钥的能力。
  • key generation, 产生密码学中使用的私钥或者密钥对的能力,不使用base key,而是使用本地系统的能力。(the ability to create a cryptographically secure key, or key pair, without the use of base key, but using the available entropy of the local system.)
  • key wrapping and unwrapping, 密钥包裹和解包,即在不接触底层密钥内容的情况下,与第三方传送、接收使用另一个密钥加密后的密钥的能力。
  • random, 生成密码学中使用的伪随机数的能力。

使用 Web Crypto API 的原因是我所使用的 PKI.js 依赖了 Web Crypto API 。

(编辑:厦门网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读