nativescript-simple-libsodium
NativeScript 简单 Libsodium。
npm i --save nativescript-simple-libsodium

npm npm

NativeScript Simple Libsodium

Sodium 是一个新、易于使用的加密、解密、签名、密码散列等软件库。它是跨编译的,并支持大多数现代设备。使用此插件,您可以直接在您的 NativeScript 项目中使用它。

对于 iOS,我是直接从源代码编译的。对于 Android,我使用了 Lazysodium 原生库。

注意: 我既不是 iOS 的专家,也不是 Android 的专家。所以,如果您认为您能做得更好,请贡献一下吧 :)

支持的平台

  1. iOS
  2. Android

Libsodium 也可以与其他编程语言一起使用。您可以从这里获取更多信息:https://libsodium.gitbook.io/doc/bindings_for_other_languages

安装

tns plugin add nativescript-simple-libsodium

使用

导入

TS/Angular

import { SimpleLibsodium, AEDMethod, AEDValues, Base64Variant, Keybytes, Noncebytes } from 'nativescript-simple-libsodium';

let simpleLibsodium = new SimpleLibsodium();

JavaScript

var mSimpleLibsodium = require("nativescript-simple-libsodium");
var simpleLibsodium = new mSimpleLibsodium.SimpleLibsodium();

请查看示例项目以获取更多示例。

生成随机数据

simpleLibsodium.generateRandomData();
// OR
simpleLibsodium.generateKeyWithSuppliedString("Jibon Costa"); // Keep in mind that in order to produce the same key from the same password, the same algorithm, the same salt, and the same values for opslimit and memlimit have to be used. Therefore, these parameters have to be stored for each user.

AED 加密/解密

let key = this.simpleLibsodium.generateRandomData(AEDValues.XCHACHA20POLY1305_IETF_KEYBYTES);
// or let key = this.simpleLibsodium.generateKeyWithSuppliedString("myKey", AEDValues.XCHACHA20POLY1305_IETF_KEYBYTES);

let enc = this.simpleLibsodium.AEDEncrypt(AEDMethod.XCHACHA20_POLY1305_IETF, "Hello World", key.raw);

console.dir(enc);

let dec = this.simpleLibsodium.AEDDecrypt(AEDMethod.XCHACHA20_POLY1305_IETF, enc.rawCrypted, key.raw, enc.rawNonce);

console.dir(dec);

保密盒

let key = this.simpleLibsodium.generateRandomData(Keybytes.SECRETBOX_KEYBYTES);
// or let key = this.simpleLibsodium.generateKeyWithSuppliedString("myKey", Keybytes.SECRETBOX_KEYBYTES);

let enc = this.simpleLibsodium.secretBoxEncrypt("Hello World", key.raw);

console.dir(enc);

let dec = this.simpleLibsodium.secretBoxOpen(enc.rawCrypted, key.raw, enc.rawNonce);

console.dir(dec);

Salsa20

let key = this.simpleLibsodium.generateRandomData(Keybytes.STREAM_KEYBYTES);
// or let key = this.simpleLibsodium.generateKeyWithSuppliedString("myKey", Keybytes.STREAM_KEYBYTES);

let enc = this.simpleLibsodium.xSalsa20Encrypt("Hello World", key.raw);

console.dir(enc);

let dec = this.simpleLibsodium.xSalsa20Decrypt(enc.rawCrypted, key.raw, enc.rawNonce);

console.dir(dec);

盒易

let bob = this.simpleLibsodium.boxKeyPaired();
let alice = this.simpleLibsodium.boxKeyPaired();

// Bob sending message to Alice. So, here will need Alice's public key & Bob's private/secret key
let enc = this.simpleLibsodium.boxEasy("Hello World", alice.public_key, bob.private_key);

console.dir(enc);

// Alice got the message from Bob. Now Alice need his private key & Bob's public key.
let dec = this.simpleLibsodium.boxOpenEasy(enc.rawCrypted, enc.rawNonce, bob.public_key, alice.private_key);

console.dir(dec);

密码散列/验证

let enc = this.simpleLibsodium.passwordHash("MyPassword");

console.dir(enc);

if (this.simpleLibsodium.passwordHashVerify(enc.plainHash, "MyPassword")) {
console.log("Password Matched!");
} else {
console.log("Password invalid!");
}

加密认证/验证

let enc = this.simpleLibsodium.cryptoAuth("Jibon Costa");

console.dir(enc);

if (this.simpleLibsodium.cryptoAuthVerify(enc.rawCrypted, "Jibon Costa", enc.rawKey)) {
console.log("Matched !")
} else {
console.log("Didn't match")
}

SHA-256/512 散列

let enc = this.simpleLibsodium.SHA2Hash("MyPassword", 512); // or 256
console.dir(enc);

方法/API

方法 描述 参考
generateRandomData(length?: number) 生成随机数据 https://libsodium.gitbook.io/doc/generating_random_data
generateKeyWithSuppliedString(mykey: string, length?: number, salt?: any, opslimit?: number, memlimit?: number) 使用密钥生成随机数据。算法:crypto_pwhash_ALG_ARGON2I13,opslimit:crypto_pwhash_OPSLIMIT_MIN,memlimit:crypto_pwhash_MEMLIMIT_MIN。如果不提供任何 salt,则将自动生成并作为输出返回。请注意,为了从相同的密码生成相同的密钥,必须使用相同的算法、相同的盐以及相同的 opslimit 和 memlimit 的值。 https://libsodium.gitbook.io/doc/password_hashing/the_argon2i_function#key-derivation
AEDEncrypt(method: AEDMethod, msg: string, key: any, nonce?: any, additionalMsg?: string) AED 加密。在这里,nonceadditionalMsg 是可选的。如果不插入任何 nonce,则将自动生成 nonce。如果不插入任何 additionalMsg,则将使用 nonce 的十六进制值作为 additionalMsg https://libsodium.gitbook.io/doc/secret-key_cryptography/aead
AEDDecrypt(method: AEDMethod, encrypData: any, key: any, nonce: any, additionalMsg?: string) AED 解密。在这里,encrypDatakeynonce 应该是二进制数据。如果您有十六进制或 base64 字符串,则在使用之前需要将其转换。在这种情况下,您可以使用 hexTobin()base64Tobytes() 方法进行转换。 https://libsodium.gitbook.io/doc/secret-key_cryptography/aead
secretBoxEncrypt(text: string, key: any, nonce?: any) 认证加密。如果不插入任何 nonce,则将自动生成 nonce https://libsodium.gitbook.io/doc/secret-key_cryptography/authenticated_encryption#combined-mode
secretBoxOpen(encrypData: any, key: any, nonce: any) 认证解密。在这里,encrypDatakeynonce 应该是二进制数据。如果您有十六进制或 base64 字符串,则在使用之前需要将其转换。在这种情况下,您可以使用 hexTobin()base64Tobytes() 方法进行转换。 https://libsodium.gitbook.io/doc/secret-key_cryptography/authenticated_encryption#combined-mode
xsalsa20Encrypt(message: string, key: any, nonce?: any) 流密码。如果不输入任何内容作为nonce,则会自动生成nonce https://libsodium.gitbook.io/doc/advanced/stream_ciphers/xsalsa20
xsalsa20Decrypt(encrypData: any, key: any, nonce: any) 流密码。在这里,encrypDatakeynonce应该是二进制数据。如果您有十六进制或base64字符串,则需要在使用前将其转换。在这种情况下,您可以使用hexTobin()base64Tobytes()方法进行转换。 https://libsodium.gitbook.io/doc/advanced/stream_ciphers/xsalsa20
boxEasy(msg: string, public_key: any, private_key: any, nonce?: any) 使用密钥对进行认证加密。如果不输入任何内容作为nonce,则会自动生成nonce https://libsodium.gitbook.io/doc/public-key_cryptography/authenticated_encryption
boxOpenEasy(ciphertext: any, public_key: any, private_key: any, nonce: any) 使用密钥对进行认证解密。在这里,ciphertextpublic_keyprivate_keynonce应该是二进制数据。如果您有十六进制或base64字符串,则需要在使用前将其转换。在这种情况下,您可以使用hexTobin()base64Tobytes()方法进行转换。 https://libsodium.gitbook.io/doc/public-key_cryptography/authenticated_encryption
boxKeyPaired() 密钥对生成 https://libsodium.gitbook.io/doc/public-key_cryptography/authenticated_encryption#key-pair-generation
passwordHash(password: string), opslimit?: number, memlimit?: number 存储密码散列。opslimit: crypto_pwhash_OPSLIMIT_INTERACTIVE,memlimit: crypto_pwhash_MEMLIMIT_INTERACTIVE https://libsodium.gitbook.io/doc/password_hashing/the_argon2i_function#password-storage
passwordHashVerify(plainHash: any, password: string) 密码验证。在这里,plainHash应该是纯文本/字符串。 https://libsodium.gitbook.io/doc/password_hashing/the_argon2i_function#password-storage
cryptoAuth(msg: string) 认证 https://libsodium.gitbook.io/doc/secret-key_cryptography/secret-key_authentication
cryptoAuthVerify(ciphertext: any, msg: string, key: any) 认证验证。在这里,ciphertextkey应该是二进制数据。如果您有十六进制或base64字符串,则需要在使用前将其转换。在这种情况下,您可以使用hexTobin()base64Tobytes()方法进行转换。 https://libsodium.gitbook.io/doc/secret-key_cryptography/secret-key_authentication#usage
SHA2Hash(msg: string, type?: number) SHA-2 (SHA 256/512)。type的值将是256512 https://libsodium.gitbook.io/doc/advanced/sha-2_hash_function
binTohex(binary: any) 十六进制编码 https://libsodium.gitbook.io/doc/helpers#hexadecimal-encoding-decoding
hexTobin(hex: string) 十六进制解码 https://libsodium.gitbook.io/doc/helpers#hexadecimal-encoding-decoding
bytesToBase64(data: any, variant?: Base64Variant) Base64编码 https://libsodium.gitbook.io/doc/helpers#base64-encoding-decoding.
base64Tobytes(base64String: string, variant?: Base64Variant) Base64解码 https://libsodium.gitbook.io/doc/helpers#base64-encoding-decoding
stringTodata(text: string) 将字符串文本转换为二进制 本地实现
dataTostring(data: any) 将二进制转换为文本 本地实现

注意:您可以将更多的方法或API从核心sodium包轻松添加到您的项目中。

Android

let simpleLibsodium = new SimpleLibsodium();
let sodium = simpleLibsodium.sodium
// now you can call any method/api from core sodium package.
sodium.crypto_secretbox_keygen();

iOS

// From iOS you will be able to call the methods directly.
crypto_secretbox_keygen();

要获取typescript类型支持,您可以在您的references.d.ts文件中添加以下行

/// <reference path="./node_modules/nativescript-simple-libsodium/typingz/android.d.ts" />
/// <reference path="./node_modules/nativescript-simple-libsodium/typingz/objc!sodium.d.ts" />

许可

Apache License Version 2.0, January 2004