ServerCrypto

Build Status Requires Swift 4.0 Supports macOS and Linux

ServerCrypto 是一个 Swift 库,可以简化服务器端密码学操作。

安装

要在你的项目中使用 ServerCrypto,将这行代码添加到你的 Package.swift 文件中

.package(url: "https://github.com/alexaubry/ServerCrypto", from: "1.0.0")

在使用该库之前,请确保已安装 OpenSSL。

在 macOS 上,你需要提供以下标志才能从命令行构建或测试

swift build -Xswiftc -I/usr/local/opt/openssl/include -Xlinker -L/usr/local/opt/openssl/lib

特性

哈希 (Hashing)

要计算字节序列的哈希值,你需要使用 Hasher 的一个实例。

Hasher 可以为 Data, [UInt8] 以及任何符合 Bytes 协议的类型生成哈希值。

支持以下哈希算法

.md4 .md5 .sha1 .sha224 .sha256 .sha384 .sha512 .ripeMd160

示例

要计算一个字符串的 SHA-256 哈希值,编写以下代码

import Hash

let hasher = Hasher.sha256

let messageData = "Hello world".data(using: .utf8)!
let hashData = try hasher.makeHash(for: messageData) // Returns a Data object
let hashHexString = hashData.hexString

HMAC 签名

要创建 HMAC 签名,你需要:

你需要使用 Signer 的一个实例来生成 HMAC 签名。任何 Hasher 支持的类型,Signer 也支持。

示例

要计算一个字符串的 SHA-256 HMAC,你需要遵循以下步骤

1- 使用密码创建一个 HMAC 密钥

import Signature

let key = try HMACKey(password: "secret")

2- 创建一个 HMAC 签名器

let signer = Signer.hmac(key)

3- 获取消息的 HMAC

let messageData = "Hello world".data(using: .utf8)!
let hmacData = signer.sign(messageData, with: .sha256) // Returns a Data object
let hmacHexString = hmacData.hexString

HMAC 验证

要验证 HMAC 签名对于你期望的消息是否有效,你需要:

你需要使用 Signer 的一个实例来验证 HMAC 签名。签名必须是一个 Data 对象。预期消息可以是任何 Hasher 支持的类型。

示例

要验证一个字符串的 SHA-256 HMAC,你需要遵循以下步骤

1- 使用预期的密码创建一个 HMAC 密钥

import Signature

let key = try HMACKey(password: "secret")

2- 创建一个 HMAC 签名器

let signer = Signer.hmac(key)

3- 验证消息的 HMAC

let hmacData = ...
let messageData = "Hello world".data(using: .utf8)!
let isValid = signer.verify(signature: hmacData, for: messageData, with: .sha256) // Returns a Bool

非对称签名

Signature.framework 可以使用私钥和诸如 RSA 和 ECDSA 之类的算法来生成签名。

要创建签名,你需要:

你需要使用 Signer 的一个实例来生成签名。任何 Hasher 支持的类型,Signer 也支持。

示例

要计算一个字符串的 SHA-256 ECDSA 签名,你需要遵循以下步骤

1- 从 PEM 文件加载私钥

import Signature

let privateKey = try AsymmetricKey.makePrivateKey(readingPEMAtPath: "path/to/public/key.pem", passphrase: "...")

你也可以使用 AsymmetricKey.makePrivateKey(readingPEMData: Data,passphrase: String?) 从内存中加载 PEM 密钥。

2- 创建一个非对称签名器

let signer = Signer.asymmetric(privateKey)

3- 获取消息的签名

let messageData = "Hello world".data(using: .utf8)!
let hmacData = signer.sign(messageData, with: .sha256) // Returns a Data object
let hmacHexString = hmacData.hexString

非对称签名验证

要验证签名对于你期望的消息是否有效,你需要:

你需要使用 Signer 的一个实例来验证签名。签名必须是一个 Data 对象。预期消息可以是任何 Hasher 支持的类型。

示例

要验证字符串的 SHA-256 ECDSA 签名对于公钥是否有效,你需要遵循以下步骤

1- 从 PEM 文件加载公钥

import Signature

let publicKey = try AsymmetricKey.makePublicKey(readingPEMAtPath: "path/to/private/key.pem")

你也可以使用 AsymmetricKey.makePublicKey(readingPEMData: Data) 从内存中加载密钥。

2- 创建一个非对称签名器

let signer = Signer.asymmetric(publicKey)

3- 验证消息的签名

let hmacData = ...
let messageData = "Hello world".data(using: .utf8)!
let isValid = signer.verify(signature: hmacData, for: messageData, with: .sha256) // Returns a Bool

作者

Alexis Aubry, me@alexaubry.fr

你可以在 Twitter 上找到我:@_alexaubry

许可协议

ServerCrypto 遵循 MIT 许可协议。 更多信息请查看 LICENSE 文件。