# Md5加密（不可逆）

MD5是一种被广泛使用的线性散列算法，可以产生出一个128位（16字节）的散列值（hash value），用于确保信息传输完整的一致性。且MD5加密之后产生的是一个固定长度（32位或16位）的数据。

**结论**：一旦看到了一个长度为32位的密文数据，该数据极有可能是通过md5算法进行的加密！

### 解密：

常规讲MD5是不存在解密的。但是理论上MD5是可以进行反向暴力破解的。暴力破解的大致原理就是用很多不同的数据进行加密后跟已有的加密数据进行对比，由此来寻找规律。理论上只要数据量足够庞大MD5是可以被破解的。但是要注意，破解MD5是需要考虑破解的成本（时间和机器性能）。假设破解当前的MD5密码需要目前计算能力最优秀的计算机工作100年才能破解完成。那么当前的MD5密码就是安全的。

### 增加破解成本的方法（方法很多，这里只说我常用的）

* 使用一段无意义且随机的私匙进行MD5加密会生成一个加密串，我们暂且称之为串1
* 将要加密的的数据跟串1拼接，再进行一次MD5，这时会生成串2
* 将串2再次进行MD5加密，这时生成的串3就是我们加密后的数据。

我们在注册账号时的密码一般都是用的MD5加密。

### 代码实操：

#### Python版本：

```python
from hashlib import md5  # 从 hashlib 模块导入 md5 方法

plaintext = '123456'  # 定义要加密的字符串

obj = md5()  # 创建一个 MD5 哈希对象
obj.update(plaintext.encode("utf-8"))  # 对字符串进行 UTF-8 编码并更新 MD5 计算

ciphertext_md5 = obj.hexdigest()  # 计算并获取 MD5 哈希值（16 进制字符串）
print(ciphertext_md5)  # 输出 MD5 哈希结果：e10adc3949ba59abbe56e057f20f883e
```

#### JS版本：下载安装crypto-js（npm install crypto-js）

```javascript
// 引入 CryptoJS 库（需要安装 crypto-js）
var CryptoJS = require('crypto-js');

// 原始数据
var plaintext = '123456';

// 计算 MD5 哈希值
var md5Digest = CryptoJS.MD5(CryptoJS.enc.Utf8.parse(plaintext)).toString();

// 输出哈希值：e10adc3949ba59abbe56e057f20f883e
console.log(md5Digest);
```

上述代码的核心关键字：md5
