Linux系统与python常用加密&解密方法
文章目录
- Linux系统与python常用加密&解密方法
- Linux系统加密解密方法
- 一、openssl
- 二、示例
- 1、加密规则语法
- 2、解密语法规则
- 3、shell脚本
- Python密码加密方法
- 一、Base64加密
- 1、加密
- 2、解密
- 二、哈希算法加密
- 三、Fernet对称加密算法
- 1、加密
- 2、解密
Linux系统加密解密方法
一、openssl
openssl
是一个广泛用于加密和安全通信的开源工具包,提供了许多密码学算法和安全协议的实现。在使用 openssl
进行加密时,一些常见的规则和概念包括以下几点:
- 对称加密和非对称加密:
- 对称加密: 使用相同的密钥进行加密和解密。常见的对称加密算法有 AES(Advanced Encryption Standard)。
- 非对称加密: 使用一对相关的密钥,公钥用于加密,私钥用于解密,或者私钥用于签名,公钥用于验证签名。常见的非对称加密算法有 RSA、DSA、ECDSA。
- 加密算法和模式:
- 加密算法: 定义了实际进行加密和解密的算法。常见的对称加密算法包括 AES、DES(Data Encryption Standard)、3DES(Triple DES)等。非对称加密算法包括 RSA、DSA、ECDSA。
- 加密模式: 定义了对数据进行分块和处理的方式。常见的加密模式包括 ECB(Electronic Codebook)、CBC(Cipher Block Chaining)、GCM(Galois/Counter Mode)等。
- 哈希函数:
- 在加密中,哈希函数常用于产生数据的固定长度的摘要,用于校验数据的完整性和生成数字签名。常见的哈希函数有 SHA-256、SHA-3、MD5(不安全,不推荐使用)等。
- 密钥长度:
- 对称加密算法使用的密钥长度影响加密强度。通常,密钥越长,加密强度越高,但也会导致性能开销增加。AES算法支持128、192和256位的密钥长度。
- 非对称加密算法使用的密钥长度同样影响加密强度,一般以比特位数表示。
- Initialization Vector(IV):
- 在使用块加密模式(如CBC)时,IV 用于对第一个数据块进行初始化。IV 的作用是确保相同的明文在加密时生成不同的密文。
在 openssl
命令中,你会看到一些常用的参数,如:
-
-aes-256-cbc
:指定使用 AES 算法,以 CBC 模式进行加密,密钥长度为 256 位。 -
-salt
:在加密时使用盐值,增加加密的随机性,提高安全性。 -
-k key
:指定使用的密钥。
二、示例
1、加密规则语法
echo $password | openssl enc -e -aes-128-cbc -v -p -k $key -a
2、解密语法规则
echo -e $encrypted_password | openssl enc -d -aes-128-cbc -v -p -k $key -a
3、shell脚本
#!/bin/bash
key='aksk2001'
# 加密函数
encrypt_password() {
read -s -p "请输入要加密的密码: " password
echo ""
encrypted_password=$(echo $password | openssl enc -e -aes-128-cbc -k $key -a)
echo "加密后的密码: $encrypted_password"
}
# 解密函数
decrypt_password() {
read -p "请输入要解密的密码: " encrypted_password
decrypted_password=$(echo -e $encrypted_password | openssl enc -d -aes-128-cbc -k $key -a)
if [ $? -eq 0 ]; then
echo "解密后的密码: $decrypted_password"
else
echo "解密失败,请检查输入的加密密码."
fi
}
# 主菜单
while true; do
echo "1. 加密密码"
echo "2. 解密密码"
echo "3. 退出"
read -p "请选择操作 (1/2/3): " option
case $option in
1)
encrypt_password
;;
2)
decrypt_password
;;
3)
echo "正在退出..."
exit 0
;;
*)
echo "无效选项,请重新选择."
;;
esac
done
Python密码加密方法
一、Base64加密
Base64 编码来加密和解密密码。请注意,这不是一个真正安全的加密方式,而仅仅是一个演示例子,不建议在实际应用中使用这种简单的加密方法。
1、加密
import base64
def encrypt_password_custom(password):
# 自定义简单的加密方案,示例中使用了简单的Base64编码
encrypted_password = base64.urlsafe_b64encode(password.encode()).decode()
return encrypted_password
# 要加密的密码
password = "1q2w#E$R1234567498"
# 对密码进行自定义加密
encrypted_password_custom = encrypt_password_custom(password)
print("自定义加密后的密码:", encrypted_password_custom)
print("加密后的密码长度:", len(encrypted_password_custom))
2、解密
import base64
def decrypt_password_custom(encrypted_password):
# 自定义简单的解密方案,示例中使用了Base64解码
decoded_encrypted_password = base64.urlsafe_b64decode(encrypted_password + '=' * (4 - len(encrypted_password) % 4))
return decoded_encrypted_password.decode()
# 要加密的密码
encrypted_password_custom = "MXEydyNFJFIxMjM0NTY3NDk4"
# 对密码进行自定义解密
decrypted_password_custom = decrypt_password_custom(encrypted_password_custom)
print("自定义解密后的密码:", decrypted_password_custom)
二、哈希算法加密
哈希算法是一种单向加密算法,它的设计目标是不可逆,也就是说,从哈希值无法还原出原始数据。因此,哈希算法不提供解密操作。
常见的哈希算法,如 SHA-256,SHA-3 等,只提供哈希计算,而没有专门的解密函数。当你使用哈希算法对密码进行哈希时,哈希值是固定长度的一串字符,不同的输入会产生不同的哈希值。
验证密码通常是将用户提供的密码重新哈希,然后与之前存储的哈希值比较。如果两者相等,说明提供的密码是正确的。但这并不是解密,而是重新计算哈希值。
import hashlib
def hash_password(password):
hashed_password = hashlib.sha256(password.encode()).hexdigest()
return hashed_password
# 用户注册时,将密码哈希后存储
user_password = "aksk2001"
hashed_user_password = hash_password(user_password)
# 用户登录时,验证密码
login_password = "aksk2001"
if hash_password(login_password) == hashed_user_password:
print("密码正确")
else:
print("密码错误")
三、Fernet对称加密算法
Fernet对称加密算法对密码进行加密。Fernet是一种基于对称密钥的加密算法,它使用相同的密钥进行加密和解密,Fernet
加密后的字符串长度是44个字符。
安全存储密钥至关重要,而且密钥的泄漏可能导致加密的破解。因此,密钥的生成、存储和使用都需要谨慎处理。
1、加密
from cryptography.fernet import Fernet
def encrypt_password(key, password):
cipher_suite = Fernet(key)
encrypted_password = cipher_suite.encrypt(password.encode())
return encrypted_password
# 生成加密密钥
key = '9nEkpGjhMpHjNSnQLPBHc6tyildtx70psP28CU9No94='
# 生成随机密钥
# key = Fernet.generate_key()
# 要加密的密码
password = "aksk2001"
# 对密码进行加密
encrypted_password = encrypt_password(key, password)
print("加密后的密码:", encrypted_password)
2、解密
from cryptography.fernet import Fernet
def decrypt_password(key, encrypted_password):
cipher_suite = Fernet(key)
decrypted_password = cipher_suite.decrypt(encrypted_password).decode()
return decrypted_password
# 解密密钥
key = '9nEkpGjhMpHjNSnQLPBHc6tyildtx70psP28CU9No94='
# 解密前密码
encrypted_password2 = 'gAAAAABlaVZTYFNAV8oMbLDezp90-mbbiCmYu-AcdP5-lBCfgJFC1nMedUSa90u21ZcYlEXiXR69v1-AbwFC9eSYjBq62jQaUA=='
# 对密码进行解密
decrypted_password2 = decrypt_password(key, encrypted_password2)
print("解密后的密码:", decrypted_password2)