基于Python和Django实现的虚拟网络银行

简介: 基于Python和Django实现的虚拟网络银行

开发环境

  • 操作系统:Windows 10 Pro
  • 数据库:Mysql
  • 服务器:Django
  • 语言:Python3.6 + html + JavaScript + css

3.3 用户环境

Windows、Mac、Linux、Android、IOS,通过浏览器访问。支持的浏览器为 IE、火狐、谷歌浏览器。


3.4 业务数据流


bc9632c4a38b0d7c749b89abea832544.jpg



3.5 功能模块划分


6d548ecb1854cdb13e9853411f527aac.jpg


3.6 功能模块定义


3.6.1 管理员模块


管理员模块需要经过银行管理员登陆并认证后操作。管理员可以审核用户注册、获取用户异常,并根据异常信息冻结账户,所有的操作记录数据库。


3.6.2 用户操作


用户包括电商用户和普通用户,都可以进行状态修改,比如修改个人信息、修改密码。有敏感操作时需要转到认证模块作安全认证。


3.6.3 身份认证


银行系统的敏感操作之前需要有安全认证。验证内容包括数字证书是否真实、是否过期,登陆状态是否正常。


3.6.4 订单审核


执行 SET 协议,判断订单信息是否真实,再执行支付操作,转账信息写入数据库,并更改账户余额。


3.6.5 通信模块


电商平台根据提供的支付链接转到银行系统,此后双方执行类似于 SSH 的协议互相认证身份并协商出临时对称密钥,用于加密之后的通信。


3.7 功能模块划分


3.7.1 用户基本信息表


Users

image.png


3.7.2 管理员基本信息表

Admins


image.png

3.7.3 转账信息


Transfer

image.png

image.png


3.7.4 银行卡信息


image.png


3.7.5 存取款信息


image.png


4.详细设计


4.1 注册


4.1.1 页面设计


3efde6ba54ff6369b83104c2ab04be0e.jpg



1d157aedbe79213859f4a286b8c25171.jpg

4.1.2 实现方法

输入地址 127.0.0.1:8001,自动跳转到登陆页面,点击注册按钮进入注册页面。


传输安全:将 CA 服务器提供的证书放到 html 页面,用户客户端提交表单时首先提取证书中的公钥字段,利用公钥加密表单,传输到服务器。服务器接收到信息后首先用私钥解密,再执行下一步操作。

前端加密 Signup.html

<script>
  functionformAck(){
    alert("success");
    varcert=document.getElementById("cert").value;#从html中获取证书
    varcertInfo=JSON.parse(cert).info.certInfo 
    varpubKey=JSON.parse(certInfo).PublicKey#从证书中获取公钥
    varencrypt=newJSEncrypt();
    encrypt.setPublicKey(pubKey);
    vardata={
      name:$('#name').val(),
      idcard:encrypt.encrypt($('#idcard').val(),true),
      phone:encrypt.encrypt($('#phone').val(),true),
      email:encrypt.encrypt($('#email').val(),true),
      passwd:encrypt.encrypt($('#passwd').val(),true),
      paypasswd:encrypt.encrypt($('#paypasswd').val(),true)
    };
    console.log(data)
    $.ajax({
      url:"/signup/",
      type:"POST",
      data:data,
      success:function(data1){
        alert(data1)
        window.location.href="/login/"
      }
    })
  }</script>


后端加密 Views.py

defsignup(request):
  ifrequest.method=="GET":
    returnrender(request,"signup.html")
  ifrequest.method=="POST":
    name=request.POST.get("name",None)
    idcard=tools.DecodeDecrypt(request.POST.get("idcard",None)).decode()
    phone=tools.DecodeDecrypt(request.POST.get("phone",None)).decode()
    email=tools.DecodeDecrypt(request.POST.get("email",None)).decode()
    passwd=tools.DecodeDecrypt(request.POST.get("passwd",None)).decode()
    paypasswd=tools.DecodeDecrypt(request.POST.get("paypasswd",None)).decode()

数据库存储密码:登陆密码和支付密码不能直接存入数据库,而是存加 salt 的哈希值。



9018db9f12790199ea10bb8eeed69ba8.jpg

4.2 登陆

4.2.1 页面设计

068088d637c3821fce04655eb9d6ddba.jpg


4.2.2 实现方法

用户点击登陆后,客户端向服务器发送一个 post 请求,包含 公钥加密后的ID 和登陆密码。服务器接收后,用系统私钥解密,解密成功后:


  • 验证登陆密码的加 salt 哈希和数据库存储是否一致,一致的话执行下一步操作,不一致返回登陆界面
  • 服务器设置 session,添加用户 ID 和 name 字段,之后每次操作验证登陆信息时,检查这两个 session 值是否存在即可
  • 服务器返回“success“字段,客户端接收后执行 href="/viewuserinf/" ,执行信息查看操作
  • 传输安全:用户在登陆界面提交的表单,前端用公钥加密,服务器用私钥解密,具体操作同注册的传输安全


4.3 信息查看


4.3.1 页面设计

1879baae7b62e69feecd77d2d11e2a6e.jpg


4.3.2 实现方法


请求查看页面的请求类型全部为 get 型,url 为 127.0.0.1:8001/viewuserinf/,服务器接收到该请求后,首先验证session 的 id 字段是否存在,存在才可继续查看,不存在则清楚所有 session 并返回登陆界面。


Views.py

defviewuserinf(request):
  ifrequest.method=="GET":
    try:
      id_session=request.session["id"]
      tmp=Users.objects.get(id=int(id_session))
      returnrender(request,"user_inf_show.html",{"inf":tmp})
    except:
      returnrender(request,"login.html")
  returnrender(request,"login.html")

4.4信息修改


4.4.1 页面设计



2267fc5bb3215dfbb72e40e1b26bea19.jpg


4.4.2 实现方法


由于用户姓名、身份证号是认证信息,不可修改,登陆密码和支付密码不在此模块。所以这里只能修改手机号和电子邮箱。


获取信息修改页面的请求方式是 get,用户点击“信息修改”按钮或者直接在 浏 览 器 地 址 栏 中 输 入 url : http://127.0.0.1:8001/edituserinf/ ,就会返回信息修改页面。


信息修改的表单提交使用 post 请求,用户输入的表单信息用公钥加密后传输,服务器接收后用私钥解密,然后检查 session 的 id 字段是否存在,存在则修改成功,返回信息查看界面,否则返回登陆界面。


4.5 更改密码


4.5.1 页面设计


72e72e8fcceaa3190cfd2baf9c9e642f.jpg


e96ae77d9e941a5be704ed374a2fa371.jpg


4.5.2 实现方法


获取修改密码界面的请求方式是 get,用户在登陆状态下,点击“修改密码”或 者 在 浏 览 器 地 址 栏 输 入 url:127.0.0.1:8001/editpasswd/获得界面。用户可选择登陆密码和支付密码,更改密码必须输入原密码。


表单提交的请求方式是 post 请求,客户端使用公钥加密表单,服务器接收请求后用私钥解密,之后:


  • 检查服务器 session 中是否存在 id 字段,存在继续下一步,不存在返回登陆界面
  • MD5加盐计算密码哈希值,与数据库存储的哈希值对比,相等,执行下一步,否则返回信息修改界面重新提交
  • 计算新密码的加 salt 哈希值,存入数据库。修改完成后,如果是修改支付密码,返回信息查看界面,如果是修改登陆密码,删除 session 后返回登陆界面


安全设计 :客户端公钥加密传输表单,客户端私钥解密,保证传输安全。修改密码必须验证原密码,并且密码只存储哈希值,保证密码数据库安全。


4.6 银行卡管理


4.6.1 页面设计

查看所有个人银行卡:


f953a6556e258030a954df712e199506.jpg


添加银行卡:


添加银行卡:


用户获取银行卡管理界面的请求方式为 get,在登陆状态下点击“银行卡管理”或者 url 输入 127.0.0.1:8001/cardmanage/ 进入银行卡管理界面。服务器将银行卡信息返回给用户,每张银行卡信息包括卡号、建立时间、余额和状态。由于涉及到金额,银行卡一旦添加不可删除。


在银行卡管理模块可以选择添加银行卡,获取页面的请求方式仍是 get。获取到界面后,用户必须输入支付密码,点击确认添加,向服务器发送 post 请求,表单内容为 公钥加密后的支付密码。


服务器接收到请求后,首先检查 session 的 id 字段是否存在,存在执行下一步,否则删除全部 session 返回登陆界面。解密表单内容,获取明文支付密码,计算加 salt 哈希值,对比数据库支付密码哈希值,相同后即可分配银行卡。


银行卡添加成功后,分配一个唯一卡号,状态默认为正常,余额默认为 0。随后返回银行卡管理界面。


4.7 转账


4.7.1 页面管理


d209d004dfd8a542a88afe14d28837f7.jpg


4.7.2 实现方法


在登录状态下,用户通过点击“转账”或者输入 url: 127.0.0.1:8001/transfer/向服务器发送 get 请求,进入转账界面。


用户选择本方卡号,输入对方卡号、转账金额、支付密码后确认转账,javascrpt使用公钥加密表单后传输给服务器。服务器接收并私钥解密后:


  • 检查登陆状态,即检查 session 的 id 字段是否存在,不存在返回登陆界面,存在则进入下一步
  • 计算用户输入的 paypasswd 的加 salt 哈希值,与数据库提取的密码哈希值对比,相同则进入下一步,不同则返回转账界面重新输入
  • 将此转账信息写入数据库,再将对应的银行卡做余额更改。执行成功后进入转账查询界面。


安全:

  • 客户端公钥加密后传输,防止旁路攻击
  • 密码存哈希值,明文不出现数据库
  • 转账记录表和银行卡表中记录的更改在确认转账可以执行后,才一起更改防止数据不同步
tmp1=Transfer(time=time,
  scard=CrashCard.objects.get(id=scard),
  dcard=CrashCard.objects.get(id=dcard),
  suser=Users.objects.get(id=uid),
  duser=Users.objects.get(id=CrashCard.objects.get(id=dcard).user.id),
  amount=amount,
  scbalance=CrashCard.objects.get(id=scard).balance-amount,
  dcbalance=CrashCard.objects.get(id=dcard).balance+amount)CrashCard.objects.filter(id=scard).update(balance=scbalance-amount)CrashCard.objects.filter(id=dcard).update(balance=dcbalance+amount)tmp1.save()


4.8 存款


4.8.1 页面设计


775066300958f9acb886fe80da12b4e9.jpg


4.8.2 实现方法

在登录状态下,用户点击“存款”或者输入 url: 127.0.0.1:8001/ userdeposit/ 向服务器发送 get 请求,进入存款界面。

在存款界面,输入存款卡号和金额,用 RSA 公钥加密表单,传输给服务器。

服务器解密后,获取卡号和金额,更改数据库银行卡表单,完成操作。返回存取款查询界面。

4.9 取款


4.9.1 页面设计

a4f03bd3cc403542c9f56e3c3790d759.jpg


4.9.2 实现方法

取款操作和存款操作的实现方法类似。不同的内容为:

  • 取款的 url 为 127.0.0.1:8001/userdraw/
  • 取款需要验证支付密码,支付密码需要计算加 salt 哈希值与数据库存储哈希值对比


4.10 转账查询


4.10.1 页面设计

6001f1ad26966f5461b3b8b11cbb3a9b.jpg


4.10.2 实现方法

在登录状态下,用户点击转账查询或者输入url: 127.0.0.1:8001/ viewtransfer/向服务器发送get请求,进入转账查询界面。

服务器检查登陆状态,即验证 session 的 id 字段是否存在。存在则将该用户的转账记录返回客户端。

4.11 存取款查询


4.11.1 页面设计


732a248f777cb9f783a95d5145f65f3f.jpg



4.10.2 实现方法


在登录状态下,用户点击转账查询或者输入url:127.0.0.1:8001/ viewdrawdeposit/向服务器发送get请求,进入转账查询界面。

存取款查询的实现方法与转账查询方法基本相同。


5.结束语

  • 常规网站的设计如果不考虑安全,那么网站能用但是风险极高
  • 加密传输可使用 RSA 公钥前端加密,后端解密
  • 本次项目的实现让我了解了很多信息安全的知识,增加了动手能力
  • 本门课程收获很大



相关文章
|
6月前
|
运维 监控 数据可视化
Python 网络请求架构——统一 SOCKS5 接入与配置管理
通过统一接入端点与标准化认证,集中管理配置、连接策略及监控,实现跨技术栈的一致性网络出口,提升系统稳定性、可维护性与可观测性。
|
9月前
|
机器学习/深度学习 算法 量子技术
GQNN框架:让Python开发者轻松构建量子神经网络
为降低量子神经网络的研发门槛并提升其实用性,本文介绍一个名为GQNN(Generalized Quantum Neural Network)的Python开发框架。
205 4
GQNN框架:让Python开发者轻松构建量子神经网络
|
6月前
|
机器学习/深度学习 大数据 关系型数据库
基于python大数据的青少年网络使用情况分析及预测系统
本研究基于Python大数据技术,构建青少年网络行为分析系统,旨在破解现有防沉迷模式下用户画像模糊、预警滞后等难题。通过整合多平台亿级数据,运用机器学习实现精准行为预测与实时干预,推动数字治理向“数据驱动”转型,为家庭、学校及政府提供科学决策支持,助力青少年健康上网。
|
7月前
|
JavaScript Java 大数据
基于python的网络课程在线学习交流系统
本研究聚焦网络课程在线学习交流系统,从社会、技术、教育三方面探讨其发展背景与意义。系统借助Java、Spring Boot、MySQL、Vue等技术实现,融合云计算、大数据与人工智能,推动教育公平与教学模式创新,具有重要理论价值与实践意义。
|
8月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
549 18
|
9月前
|
JSON 网络安全 数据格式
Python网络请求库requests使用详述
总结来说,`requests`库非常适用于需要快速、简易、可靠进行HTTP请求的应用场景,它的简洁性让开发者避免繁琐的网络代码而专注于交互逻辑本身。通过上述方式,你可以利用 `requests`处理大部分常见的HTTP请求需求。
701 51
|
8月前
|
数据采集 存储 数据可视化
Python网络爬虫在环境保护中的应用:污染源监测数据抓取与分析
在环保领域,数据是决策基础,但分散在多个平台,获取困难。Python网络爬虫技术灵活高效,可自动化抓取空气质量、水质、污染源等数据,实现多平台整合、实时更新、结构化存储与异常预警。本文详解爬虫实战应用,涵盖技术选型、代码实现、反爬策略与数据分析,助力环保数据高效利用。
431 0
|
9月前
|
存储 监控 算法
基于 Python 跳表算法的局域网网络监控软件动态数据索引优化策略研究
局域网网络监控软件需高效处理终端行为数据,跳表作为一种基于概率平衡的动态数据结构,具备高效的插入、删除与查询性能(平均时间复杂度为O(log n)),适用于高频数据写入和随机查询场景。本文深入解析跳表原理,探讨其在局域网监控中的适配性,并提供基于Python的完整实现方案,优化终端会话管理,提升系统响应性能。
228 4
|
10月前
|
Linux 数据库 数据安全/隐私保护
Python web Django快速入门手册全栈版,共2590字,短小精悍
本教程涵盖Django从安装到数据库模型创建的全流程。第一章介绍Windows、Linux及macOS下虚拟环境搭建与Django安装验证;第二章讲解项目创建、迁移与运行;第三章演示应用APP创建及项目汉化;第四章说明超级用户创建与后台登录;第五章深入数据库模型设计,包括类与表的对应关系及模型创建步骤。内容精炼实用,适合快速入门Django全栈开发。
516 1
|
11月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
263 15

推荐镜像

更多