首先让我们先来了解一下哈希,哈希加盐,凯撒加密的加密原理:
- 哈希 | Hash encryption(SHA256)
哈希是一种数据处理技术,它将任意长度的数据(通常称为“明文”或“输入”)通过特定的数学算法映射成固定长度的、具有唯一性的输出值,即哈希值或散列值。哈希算法具有以下主要特性:
- 单向性:哈希过程通常是不可逆的,即无法根据哈希值直接恢复出原始数据。这种特性使得哈希非常适合用于密码存储,因为即使攻击者窃取了哈希值,也无法直接得知用户的原始密码。
- 确定性:对于相同的输入数据,同一个哈希函数总能产生相同的哈希值。这意味着只要输入不变,无论何时何地重复计算,得到的哈希结果都是恒定的。
- 雪崩效应:哈希函数应具有高度敏感性,即输入数据的微小变化应导致输出哈希值的巨大差异。这种特性增强了哈希的安全性,使得攻击者难以通过相似输入推断出其哈希值。
- 碰撞阻力:理想情况下,不同的输入数据应对应不同的哈希值,且很难找到两个不同的输入产生相同哈希值(即发生碰撞)。虽然理论上随着输出空间有限,碰撞必然存在,但在实际应用中,优秀的哈希函数设计会尽量降低碰撞概率。
常见的哈希算法包括MD5、SHA-1、SHA-256等。在密码学领域,SHA-2系列(如SHA-256)因其较高的安全性和广泛接受度而被广泛使用。
- 哈希加盐 | Hash salted encryption(SHA256)
哈希加盐是一种增强密码哈希安全性的技术。在对用户密码进行哈希之前,首先添加一个唯一的随机字符串,这个字符串就是“盐”。具体步骤如下:
- 生成盐值:为每个用户账户生成一个随机且唯一的盐值。盐值通常由服务器端生成,并与哈希后的密码一同存储在数据库中。
- 拼接盐值:在实际计算哈希值前,将盐值与用户提供的原始密码进行拼接。
- 执行哈希:使用选定的哈希函数(如SHA-256)对拼接后的字符串进行哈希运算,得到带有盐的哈希值。
- 存储盐值与哈希值:将盐值与对应的哈希值一起保存在数据库中,以便后续进行密码验证。
哈希加盐的主要优点包括:
- 抵抗彩虹表攻击:攻击者可能预先计算常见密码及其哈希值并形成“彩虹表”,用于快速查找匹配的哈希值。加盐后,每个用户的密码都与独一无二的盐值结合,使得预计算的哈希表失效,大大增加了攻击成本。
- 抵御多账户共用同一密码的风险:即使多个用户使用相同的密码,由于各自的盐值不同,他们的哈希值也将完全不同,从而避免了一旦一个账户被破解,其他使用相同密码的账户也随之暴露的情况。
- 凯撒加密 | Caesars encryption
凯撒加密是一种古老的、简单的替换式加密方法,由古罗马将军朱利斯·凯撒命名。它通过将明文中每个字符按照一定的位移量向前或向后移动指定位置来进行加密。具体操作如下:
- 设定偏移量:选择一个整数作为偏移量(通常在较小范围内,如1到25),表示字母表中的移动步数。
- 字符替换:对于明文中每一个字母,将其在字母表中向前或向后移动指定的偏移量。例如,如果偏移量为3,字母“A”将被替换为“D”,字母“B”变为“E”,以此类推。遇到字母表边缘时循环绕回,如字母“X”偏移3位变成“A”。
- 非字母字符处理:非字母字符(数字、标点符号等)通常保持不变或按特定规则处理。
- 解密:知道偏移量的情况下,可以通过反向操作(即按照相同的偏移量向相反方向移动字符)实现解密。
凯撒加密尽管简单易懂,但在现代密码学中因其极低的复杂性和易于破解的特点,仅适用于教学演示或极其简单的情境,而不适用于保护重要信息。实际应用中,更强大的加密算法如AES(高级加密标准)等被广泛采用。
然后再了解一下制作前端的streamlit:
- streamlit
Streamlit 是一个开源的 Python 库,专为数据科学家、机器学习工程师和数据分析专业人士设计,旨在简化和加速从原型到生产级 web 应用程序的开发流程。Streamlit 允许用户使用纯 Python 代码编写交互式数据可视化和分析工具,而无需具备复杂的前端开发技能(如 HTML、CSS 和 JavaScript)。你也可以认为streamlit = 后端 + 前端 + 服务器。
以下是 Streamlit 的关键特性和功能:
- 易用性:简洁的 API:Streamlit 提供了一个直观、面向对象的 API,允许用户以类似于编写脚本的方式构建应用程序。只需调用相应的函数或装饰器,即可轻松添加各种组件(如图表、表格、文本、滑块、按钮等)到应用程序中。
- 实时交互:即时反馈:应用程序在用户做出更改或与界面互动时立即更新,无需手动刷新页面。这极大地提升了探索数据和调整参数的效率。
- 数据驱动:无缝集成:Streamlit 能够很好地与其他数据处理库(如 Pandas、NumPy)、绘图库(如 Matplotlib、Plotly、Seaborn)以及机器学习库(如 Scikit-learn、TensorFlow、PyTorch)配合使用,方便用户直接在应用程序中展示模型预测、实验结果和数据分析。
- 开箱即用的组件:丰富组件集:提供了多种内置组件来展示不同类型的数据和交互元素,包括文本、图像、视频、地图、表格、数据框、图表、文件上传/下载、多选框、滑块、日期选择器、下拉列表等。
- 无服务器部署:一键分享:支持一键部署到 Streamlit Cloud 或其他云服务提供商(如 Heroku、AWS、Google Cloud Platform),使得应用程序可以轻松地分享给团队成员、客户或公众访问,无需关心服务器管理和运维细节。
Streamlit 以其高度的易用性和丰富的功能集,成为数据科学社区中广受欢迎的工具之一,尤其适合那些希望专注于数据处理和模型开发本身,而非网页开发的从业者。它降低了开发高质量、交互式数据应用的门槛,使得专业人员能够快速迭代和分享自己的工作成果,促进了数据驱动决策和知识传播的进程。
然后就可以开始写后端的部分了 : )
- 首先要导入streamlit和hashlib这连个模块。
import streamlit as st
import hashlib
如果没有安装streamlit的要先用pip安装:
pip install streamlit
网速不好可以换国内源:
pip install streamlit -i https://mirrors.aliyun.com/pypi/simple
- 初始化变量并设置页面标题,说明。
# 初始化结果字符串
result = ""
# 设置页面标题
st.title("Encrypter")
# 输出页面说明
st.write("### Drived by CodeSpace | Jialun Wu\n")
- 定义三个负责加密功能的函数。
def sha256_encryption(text):
"""
使用SHA256算法对文本进行加密。
参数:
text: str - 需要加密的原始文本。
返回值:
str - 加密后的文本(十六进制字符串)。
"""
return hashlib.sha256(text.encode()).hexdigest()
def sha256_salted_encryption(text, salt):
"""
使用带盐的SHA256算法对文本进行加密。
参数:
text: str - 需要加密的原始文本。
salt: str - 盐值,用于增强加密强度。
返回值:
str - 加密后的文本(十六进制字符串)。
"""
return hashlib.sha256((text + salt).encode()).hexdigest()
def caesar_encryption(text, shift):
"""
使用凯撒密码对文本进行加密。
参数:
text: str - 需要加密的原始文本。
shift: int - 往后移动的字母数(1-26)。
返回值:
str - 加密后的文本。
"""
encrypted = ""
for char in text:
if char.isalpha():
shifted = chr(((ord(char.lower()) - 97 + shift) % 26) + 97)
encrypted += shifted.upper() if char.isupper() else shifted
else:
encrypted += char
return encrypted
- 设置边栏和核心逻辑。
# 侧边栏选项设置
with st.sidebar:
choice = st.selectbox("Please select an encryption method.", ["Hash encryption(SHA256)", "Hash salted encryption(SHA256)", "Caesars encryption"])
# 根据不同的加密方法,获取相应的输入
if choice == "Hash encryption(SHA256)":
text = st.text_input("Please enter the original text:")
elif choice == "Hash salted encryption(SHA256)":
text = st.text_input("Please enter the original text:")
salt = st.text_input("Please enter a value for the salt:")
elif choice == "Caesars encryption":
text = st.text_input("Please enter the original text:")
shift = st.number_input("Please enter the offset:", min_value=1, max_value=26)
# 点击加密按钮后的处理
if st.button("Encrypt"):
if choice == "Hash encryption(SHA256)":
result = sha256_encryption(text)
elif choice == "Hash salted encryption(SHA256)":
result = sha256_salted_encryption(text, salt)
elif choice == "Caesars encryption":
if text.isalpha():
result = caesar_encryption(text, shift)
else:
st.write("Please enter the original text:")
result = None
- 输出结果。
# 输出加密结果
if result:
st.write("##### The encryption result is:", result)
所以完整代码来咯*★,°*:.☆( ̄▽ ̄)/$:*.°★* 。
import streamlit as st
import hashlib
# 初始化结果字符串
result = ""
# 设置页面标题
st.title("Encrypter")
# 输出页面说明
st.write("### Drived by CodeSpace | Jialun Wu\n")
def sha256_encryption(text):
"""
使用SHA256算法对文本进行加密。
参数:
text: str - 需要加密的原始文本。
返回值:
str - 加密后的文本(十六进制字符串)。
"""
return hashlib.sha256(text.encode()).hexdigest()
def sha256_salted_encryption(text, salt):
"""
使用带盐的SHA256算法对文本进行加密。
参数:
text: str - 需要加密的原始文本。
salt: str - 盐值,用于增强加密强度。
返回值:
str - 加密后的文本(十六进制字符串)。
"""
return hashlib.sha256((text + salt).encode()).hexdigest()
def caesar_encryption(text, shift):
"""
使用凯撒密码对文本进行加密。
参数:
text: str - 需要加密的原始文本。
shift: int - 往后移动的字母数(1-26)。
返回值:
str - 加密后的文本。
"""
encrypted = ""
for char in text:
if char.isalpha():
shifted = chr(((ord(char.lower()) - 97 + shift) % 26) + 97)
encrypted += shifted.upper() if char.isupper() else shifted
else:
encrypted += char
return encrypted
# 侧边栏选项设置
with st.sidebar:
choice = st.selectbox("Please select an encryption method.", ["Hash encryption(SHA256)", "Hash salted encryption(SHA256)", "Caesars encryption"])
# 根据不同的加密方法,获取相应的输入
if choice == "Hash encryption(SHA256)":
text = st.text_input("Please enter the original text:")
elif choice == "Hash salted encryption(SHA256)":
text = st.text_input("Please enter the original text:")
salt = st.text_input("Please enter a value for the salt:")
elif choice == "Caesars encryption":
text = st.text_input("Please enter the original text:")
shift = st.number_input("Please enter the offset:", min_value=1, max_value=26)
# 点击加密按钮后的处理
if st.button("Encrypt"):
if choice == "Hash encryption(SHA256)":
result = sha256_encryption(text)
elif choice == "Hash salted encryption(SHA256)":
result = sha256_salted_encryption(text, salt)
elif choice == "Caesars encryption":
if text.isalpha():
result = caesar_encryption(text, shift)
else:
st.write("Please enter the original text:")
result = None
# 输出加密结果
if result:
st.write("##### The encryption result is:", result)
在终端运行命令就可以打开浏览器并允许啦:
streamlit run <你的文件路径>.py
运行起来就这样: