前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >前端该知道些密码学和安全上的事儿

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

作者头像
icepy
发布于 2019-06-24 09:47:57
发布于 2019-06-24 09:47:57
1.2K00
代码可运行
举报
文章被收录于专栏:子曰五溪子曰五溪
运行总次数:0
代码可运行
今年至少有六个月的时间在和密码学,安全,隐私上的事情打交道,很有必要为今年总结一篇收官之作,整篇文章会描述一些基础概念,以及我力所能及的一些理解,这份知识很有可能不准确,主要让前端的同学们有一些概念,知道有这么回事,大佬轻拍;

密码学浅识

在密码学的世界里加密之前的消息被称为明文 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:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as CryptoJS from "crypto-js";

export function aesDecrypt(text, originKey){
 const bytes = CryptoJS.AES.decrypt(text, originKey);
 return bytes.toString(CryptoJS.enc.Utf8);
}

export function aesEncrypt(text, originKey){
 const c = CryptoJS.AES.encrypt(text, originKey);
 return c.toString();
}

单向散列函数

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import * as CryptoJS from "crypto-js";

const sha256 = CryptoJS.algo.SHA256.create();

sha256.update("Message Part 1");
sha256.update("Message Part 2");
sha256.update("Message Part 3"); 
 
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 。

PKI(Public Key Infrastructure)是一个用非对称密码算法原理和技术来实现并提供安全服务的具有通用性的安全基础设施,是一种遵循标准的利用公钥加密技术为网上电子商务、电子政务的开展,提供一整套安全的基础平台。PKI,公钥基础设施,顾名思义,PKI技术就是利用公钥理论和技术建立的提供网络信息安全服务的基础设施。PKI管理平台能够为网络中所有需要采用加密和数字签名等密码服务的用户提供所需的密钥和证书管理,用户可以利用PKI平台提供的安全服务进行安全通信。

安全

前端的安全性问题大体上都可归结为 浏览器安全问题,Node.js 可以归纳为另外一个领域。浏览器安全问题 又可以细分出来很多问题,比较常见的如:XSS,CSRF,这些问题看似离我们很远,因为目前我们使用的框架基本上辅助我们已经处理了这些问题,但是整个 Web 世界中还有更多更多我们还未触及的问题(对于此我也是一个小白),比如:HTTPS 与中间人攻击,定制浏览器的扩展和插件漏洞,目前我主要关注的点在 定制浏览器的扩展和插件漏洞 这一块,这个事情因为和我在处理的问题息息相关,但又和传统的 Web 安全问题有了显著的区别:

  • 权限更高的 API
  • Content Script 劫持
  • 中间人攻击
  • 各种“内核”级别的攻击

归纳起来对于权限的授权,我们应该只申请本插件只使用的 API ,千万不可使用 * 或 all_url 的形式,对于 CS 被劫持的问题,可以给网页注入的内容添加一个哈希运算,比如前面我们用到的单向散列函数来进行计算。

安全是一个特别综合性的体系,单一的前端技能可能在这上面能发挥的认知会比较有限,这里的 认知 意味着同样的一件事情,安全工程师能从这里了解到前前后后可能出现的问题。

举个例子:我们都知道 location 可以获取 URL 上的各种参数,其实如果黑客利用URL中的某些关键信息伪造了一个钓鱼网站,用户是极容易中奖的。

另外一个典型的 CSRF 问题,有着比较复杂的流程,但是它利用的还是浏览器中处理 cookie 的机制:

  • 受害者登录 a.com,并保留了登录Cookie
  • 攻击者引诱(黄色网站)受害者访问 b.com
  • b.com 向 a.com 发送一个请求 a.com/xxx=123,根据浏览器处理 Cookie 的机制,此时发起的请求会携带a.com 的 Cookie
  • a.com 接收请求后,对请求进行验证,此时已经确认是受害者发起的请求
  • a.com 以受害者的名义执行了xxx=123

当然解决这个安全问题,业界已经为我们总结了很多方案,比如 同源检测,Origin Header 等等。不过,大体上前端的安全性我们能注重一些常见问题,基本上能涵盖80%以上的问题。

对于安全问题,业界大佬推荐使用 https://msdn.microsoft.com/zh-cn/magazine/dd347831.aspx?f=255&MSPPError=-2147217396 来创建威胁模型,被归纳为 STRIDE 威胁建模,它分为如下六个纬度:

  • Spoofing
  • Tampering
  • Repudiation
  • Information Disclosure
  • Denial of Service
  • Elevation of Privilege

大体上这六个纬度就已经涵盖了几乎所有的安全性问题。那么对于前端的项目,我们可以从这六个纬度中去评估自己的项目而得到答案。

隐私和广而告之

谈及隐私是因为如今越演越烈的隐私泄露,大数据等技术的成熟度将一个人的画像描绘的越来越清晰,数据几乎就是“钱”的代名词。

可是对于前端而言(Web世界里),隐私的泄露和 `Cookie` `localStorage` 息息相关。如今的 Web 世界里被追踪的脚本大多数是用 Cookie 来实现的,简单的来说多数网站的登录持久化基本上都依赖于存储在你设备上的 Cookie,而对于广告平台的第三方 Cookie 除了隐私问题外,很有可能还有 `安全性` 的问题,如果这个脚本被劫持了的话,但大多数浏览器都默认提供了屏蔽第三方 Cookie,后来大家想到的是通过 `localStorage` 的方案去绕过被屏蔽的第三方 Cookie,这种越演越烈的广告脚本追踪,几乎就是你浏览网页在 Web 的世界里被泄露隐私的来源之一。

有时候真的很想要一个不被追踪而又能搜索数据的搜索引擎,但久久不可询,`隐私` 真是一个可爱可恨的事情,除非有人能去做这样的事情。正好 https://mijisou.com 秘迹搜是一个真正可以保护你个人隐私的网络搜索服务,它不会记录任何你的查询关键字,也从不存储你的个人信息,不传播你的任何信息,真正做到搜索不留痕,摆脱你不想要的定向广告的骚扰和可能的隐私泄露,它完美的符合了我的预期。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2018-12-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 子曰五溪 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
MySQL八:读懂MVCC多版本并发控制
mysql在并发的情况下,会引起脏读,幻读,不可重复读等一系列的问题,为解决这些问题,引入了mvcc的机制。本文就详细看看mvcc是怎么解决脏读,幻读等问题的。
云扬四海
2022/09/26
7850
【MySql】多版本并发控制MVCC前置知识——隐藏字段、undo日志与Read View
1.每个事务都要有自己的事务ID,可以根据事务ID的大小,来决定事务到来的先后顺序
平凡的人1
2023/10/15
4840
【MySql】多版本并发控制MVCC前置知识——隐藏字段、undo日志与Read View
MVCC多版本并发控制
持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
鳄鱼儿
2024/05/22
2910
MVCC多版本并发控制
MySQL的多版本并发控制(MVCC).
快照读(SnapShot Read) 是一种一致性不加锁的读,是 InnoDB 并发如此之高的核心原因之一。
JMCui
2020/12/29
8710
MySQL多版本并发控制(MVCC)详解
接下来的几步演示非常重要,请阅读的你仔细按照文章的流程来进行操作(阅读)。在演示环境我们会打开两个终端对MySQL执行,模拟开启两个事务:
兔云小新LM
2023/02/28
7270
MySQL多版本并发控制(MVCC)详解
MVCC多版本并发控制
全称Multi-Version Concurrency Control,即多版本并发控制,解决读—写冲突的无锁并发控制。
chenchenchen
2021/09/06
8420
MySQL是怎么读数据的——多版本并发控制
我在之前的文章中(【MySQL入门】之MySQL数据库的锁机制(一),【MySQL入门】之MySQL数据库的锁机制(二))介绍了MySQL的全局锁、表锁和行锁,今天我在来介绍下MySQL的一致性非锁定读、一致性锁定读。再说之前我们先思考个问题,当我们用mysqldump进行逻辑备份时,如果有事务对表进行修改操作,那么我们备份出来的数据是否包含修改后的数据呢?如果mysqldump备份出的数据不包含之后修改的数据,那么他又是怎么保存之前的数据的呢?
MySQL数据库技术栈
2020/08/04
8370
MySQL事务隔离实现原理,多版本并发控制MVCC
MVCC,全称Multi-Version Concurrency Control,即多版本并发控制。MVCC是一种并发控制的方法,一般在数据库管理系统中,实现对数据库的并发访问,在编程语言中实现事务内存。
王二蛋
2024/07/03
2630
多版本并发控制 MVCC
多版本并发控制技术(Multiversion Concurrency Control,MVCC)
真正的飞鱼
2022/09/14
9190
MySQL 之 MVCC 多版本并发控制
前面介绍了 MySQL 中面试常问到的锁,以及详细介绍了三种较为重要的行级别锁(间隙锁、记录锁、临键锁)。今天我们来介绍 MySQL 中 InnoDB 存储引擎为了在非锁定读下解决幻读问题,使用的 MVCC 机制。
用户6256742
2024/06/13
1860
MySQL 之 MVCC 多版本并发控制
聊聊多版本并发控制(MVCC)
MVCC一直是数据库部分的高频面试题,这篇文章来聊聊MVCC是什么,以及一些底层原理的实现。
changwoo
2024/03/30
8951
聊聊多版本并发控制(MVCC)
✅浅聊MVCC?
MVCC,即多版本并发控制(Multiversion Concurrency Control),类似于数据库锁,是一种优雅的并发控制方案。
@派大星
2024/05/02
2050
mysql中的mvcc的使用和原理详解_mysql底层原理
MVVC (Multi-Version Concurrency Control) (注:与MVCC相对的,是基于锁的并发控制,Lock-Based Concurrency Control)是一种基于多版本的并发控制协议,只有在InnoDB引擎下存在。MVCC是为了实现事务的隔离性,通过版本号,避免同一数据在不同事务间的竞争,你可以把它当成基于多版本号的一种乐观锁。当然,这种乐观锁只在事务级别提交读和可重复读有效。MVCC最大的好处,相信也是耳熟能详:读不加锁,读写不冲突。在读多写少的OLTP应用中,读写不冲突是非常重要的,极大的增加了系统的并发性能。
全栈程序员站长
2022/11/15
2K0
mysql中的mvcc的使用和原理详解_mysql底层原理
MySQL 8.0 MVCC 源码解析
MySQL 8.0 MVCC 源码解析
Java架构师必看
2021/06/17
2K0
MySQL 8.0 MVCC 源码解析
MySQL之MVCC原理详解
像select lock in share mode(共享锁); select for update, update,delete,insert(排它锁)这些操作就是一种当前读,因为它读取的是数据的最新版本,读取时还要保证其他事务不能修改当前记录,会对记录进行加锁。
用户10125653
2022/11/10
1.5K0
MySQL之MVCC原理详解
图文结合带你搞懂InnoDB MVCC
事务有四大特性ACID分别是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
老叶茶馆
2023/02/18
6950
图文结合带你搞懂InnoDB MVCC
浅析MySQL之MVCC机制
在分析 MVCC 的原理之前,我们先回顾一下 MySQL 的一些内容以及关于 MVCC 的一些简单介绍。(注:下面没有特别说明默认 MySQL 的引擎为 InnoDB )
政采云前端团队
2023/10/24
4060
浅析MySQL之MVCC机制
深入了解Mysql的MVCC机制
早上上班途中,趁着坐地铁的功夫翻了翻高性能mysql这本书,准备回顾一下MVCC这块的知识点,因为书中对MVCC的讲解不是很多,于是我很快便看完了这一段落,但是文章末尾有一段话引起了我的思考。
敲得码黛
2021/11/01
1.4K0
深入了解Mysql的MVCC机制
面试题:MySQL事务的ACID如何实现?
事务(Transaction)是并发控制的基本单位。所谓的事务呢,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。
码老思
2023/10/29
3340
面试题:MySQL事务的ACID如何实现?
MySQL的多版本并发控制(MVCC)
多版本并发控制技术的英文全称是 Multiversion Concurrency Control,简称 MVCC。
好好学java
2020/11/06
1.7K0
MySQL的多版本并发控制(MVCC)
相关推荐
MySQL八:读懂MVCC多版本并发控制
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验