简单好用的加密库:Hashids

1,618 阅读3分钟

简单好用的加密库:Hashids

简单介绍

Hashids 是一个开源的、轻量级的库,它能够将一个或多个整数转换成短小、唯一且不可预测的字符串(哈希)。尽管 Hashids 被称为“加密”工具,但实际上它提供的是一种混淆技术而非真正的加密。这意味着生成的哈希不是安全加密的,但它们足够复杂以避免被轻易猜测或逆向工程。Hashids 支持多种编程语言,包括 JavaScriptPythonJavaRuby 等等,使其成为跨平台应用的理想选择。

Hashids 主要用于生成短小、唯一且不可预测的字符串(哈希),而不是提供数据保密性或完整性保护。它通过使用一个盐值(salt)和一组字符集来编码整数,从而生成唯一的字符串。这个过程是可逆的,只要使用相同的盐值和算法设置,就可以将生成的哈希字符串转换回原始的整数。

原理

Hashids 的核心思想是通过使用特定的盐值(salt)和一组字符集来编码整数,从而生成唯一的字符串。该过程不依赖于复杂的数学运算,而是基于简单的算法。由于每个整数都会根据其值以及使用的盐值产生不同的输出,因此即使两个连续的整数也会产生完全不同的哈希字符串。此外,Hashids 还允许用户设置生成哈希字符串的最小长度,这有助于增强生成字符串的独特性。

使用示例

TypeScript

安装 hashids

npm install hashids

然后:

import { Hashids } from 'hashids';

const hashids = new Hashids("this is my salt", 8); // 盐值与最小长度

// 加密整数到哈希字符串
let hashid = hashids.encode(12345);
console.log(hashid); // 输出类似 "B0NXWE"

// 解密哈希字符串回整数
let ids = hashids.decode(hashid);
console.log(ids[0]); // 输出 12345

Node.js 示例

同样的逻辑也适用于普通的 JavaScript 文件:

const Hashids = require('hashids');

const hashids = new Hashids("this is my salt", 8);

// 加密整数到哈希字符串
let hashid = hashids.encode(12345);
console.log(hashid); // 输出类似 "B0NXWE"

// 解密哈希字符串回整数
let ids = hashids.decode(hashid);
console.log(ids[0]); // 输出 12345

Flask 示例

在 Python 的 Flask 框架中集成 Hashids 需要先安装:

pip install hashids

接下来,在 Flask 应用中:

from flask import Flask, jsonify
from hashids import Hashids

app = Flask(__name__)
hashids = Hashids(salt="your secret salt goes here", min_length=8)

@app.route('/encode/<int:id>', methods=['GET'])
def encode_id(id):
    # 将整数ID编码为Hashid
    hashid = hashids.encode(id)
    return jsonify({"hashid": hashid})

@app.route('/decode', methods=['POST'])
def decode_id():
    # 从请求体中获取hashid
    data = request.get_json()
    hashid = data.get('hashid')
    
    # 解码hashid回到原始ID
    ids = hashids.decode(hashid)
    if ids:
        return jsonify({"original_id": ids[0]})
    else:
        return jsonify({"error": "Invalid hashid"}), 400

if __name__ == '__main__':
    app.run(debug=True)

常见使用场景

Hashids 提供了一种简便的方法来创建短小而独特的字符串标识符,非常适合那些不需要高度安全保障但又希望能隐藏实际数值的应用场景。

  • URL 参数混淆:当不想暴露数据库中的真实 ID 时,可以使用 Hashids 来混淆这些 ID。
  • 分享链接保护:例如,视频网站可能希望对视频 ID 进行混淆,以便直接通过 URL 分享而不担心泄露内部信息。
  • 游戏或应用内的物品/成就系统:为了增加安全性并减少作弊的可能性,可以用 Hashids 对物品 ID 或成就 ID 进行编码。