PJCHENder 未整理筆記

[Node] Crypto

2018-02-27

[Node] Crypto

@(NodeJS)

keywords: encrypt, decrypt

Class: Cipher

Cipher 類別是實例是用來加密資料,可以類別可以有兩種使用方式:

  • 如同可以讀取(readable)和寫入(writable) 的stream ,單純未加密的資料被寫入來產生加密後的資料;
  • 使用 cipher.update()cipher.final() 來產生加密後的資料。

**Cipher 實例(instance)**無法透過 new 直接建立,而是透過 crypto.createCipher()crypto.createCipheriv() 這些方法。

1
2
3
4
5
6
7
8
9
10
11
12
const crypto = require('crypto');

/**
* Class: Cipher(加密內容)
* crypto.createCipher(algorithm, password[, options])
* cipher.update(data[, inputEncoding][, outputEncoding])
* cipher.final([outputEncoding])
**/
const cipher = crypto.createCipher('aes192', 'a password');
let encrypted = cipher.update('text to be encrypted', 'utf8', 'hex');
encrypted += cipher.final('hex');
console.log(encrypted); // 9d9ee761c4926dafa5702c862bdc47f67de9c6b5f2c246cec5357beefb0730a0

Crypto Class: Cipher @ NodeJS

Class: Decipher

Decipher 類別是實例是用來解密資料,可以類別可以有兩種使用方式:

  • 如同可以讀取(readable)和寫入(writable) 的stream ,單純加密過的資料被寫入來產生解密後的資料;
  • 使用 decipher.update()decipher.final() 來產生解密後的資料。
1
2
3
4
5
6
7
8
9
10
11
12
const crypto = require('crypto');

/**
* Class: Decipher(解密內容)
* crypto.createDecipher(algorithm, password[, options])
* decipher.update(data[, inputEncoding][, outputEncoding])
* decipher.final([outputEncoding])
**/
const decipher = crypto.createDecipher('aes192', 'a password');
let decrypted = decipher.update(encrypted, 'hex', 'utf8');
decrypted += decipher.final('utf8');
console.log(decrypted); // text to be encrypted

Crypto Class: Decipher @ NodeJS

Crypto module methods and properties

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// WebSocket 中的 Sec-WebSocket-Key 和 Sec-WebSocket-Accept
// 資料來源:http://semlinker.com/you-dont-know-websocket/

const crypto = require('crypto');
const MAGIC_KEY = 'FOO_BAR';

// 將 secWebSocketKey 加上 MAGIC_KEY 之後進行 sha1 digest
// 最後再將計算結果進行 Base64 編碼
function generateAcceptValue(secWsKey) {
return crypto
.createHash('sha1')
.update(secWsKey + MAGIC_KEY, 'utf8')
.digest('base64');
}

const secWebSocketKey = '52Rg3vW4JQ1yWpkvFlsTsiezlqw=';
const secWebSocketAccept = generateAcceptValue(secWebSocketKey);
console.log(secWebSocketAccept); // JOB0v4y5RYa/xqww7xszdKWmq6E=

參考

Crypto @ NodeJS

掃描二維條碼,分享此文章