Cryptography & Nodejs

扫盲

Cryptography is the art and science of making a cryptosystem that is capable of providing information security.

密码学(Cryptography)是研究如何通过一系列相关技术手段构建一套加密系统确保系统的信息安全。

信息安全的目标

私密性(Confidentiality)

数据完整性(data integrity)

身份可验证(authentication)

不可否认性(non-repudiation)

常见手段

加密(Encryption)

为了保证消息明文不被截获,常采取传递加密消息的手段。大致流程如下图,

加密通常需要向加密算法提供消息明文和加密秘钥,加密方式常分为对称加密和非对称加密。

对称加密的秘钥只有一个,消息发送接收方各自拥有同一个加密秘钥用来加解密。常见算法有:DES、AES等。

非对称加密的秘钥有两个,加解密需要同时配合两个秘钥进行,在通信过程中,双方各自向对方提供自己的加密公钥,在向对方发消息时使用对方的加密公钥进行加密,而对方发过来的消息则可以通过自己的秘钥对进行解密。常见的机制有:RSA 、ElGamal等。

哈希(Hash functions)

如图示,哈希是指把原消息文哈希压缩算法转换成固定长度的字符串。所选择的算法生成的字符串和原文内容唯一对应,不会有两个不同的原文输入生成出一样的字符串,因此可以用来确保原文内容的完整性。除此以外,hash之后的结果通常无法还原成输入的原文,即hash一般是不可逆的。

常见算法有MD、SHA等。

消息身份验证码(Message Authentication codes (MAC))

如图示,消息身份验证用于验证发消息的来源合法,和验证消息原文没被修改类似,通过消息身份验证码算法接收身份key和原文计算验证码,传输后在接收方再一次进行计算然后比较一致性。

数字签名(Digital Signatures)

如图示,数字签名比消息身份验证更进一步,结合原始消息文本的hash值和秘钥对计算验证码进行验证。

手段和目标之间的关系:

所以如图示,如果要设计出一个满足上述各种安全性目标的系统,需要结合其中的多种手段来实现。 例如,加密原始消息内容之后再应用数字签名机制传递消息。

参考文章:Cryptography - Quick Guide


Crypto in nodejs

nodejs中的密码相关的功能都在crypto这个模块中。

使用时需要引入该模块var crypto = require('crypto');

根据上述的密码相关手段,可以对应到crypto模块中的相应方法

官方文档有各方法的详细说明和示例代码,这里只说明一下这些方法使用的场景。

加密解密

使用crypto.createCipher[vi]crypto.createDecipher[vi].

秘钥管理

使用crypto.createDiffieHellman,crypto.createECDH等。

哈希运算

使用crypto.createHash

消息验证码运算

使用crypto.createHmac

数字签名

使用crypto.createSigncrypto.createVerify