文档章节

Django开发密码管理表实例【附源码】

SEOwhywhy
 SEOwhywhy
发布于 2018/12/06 07:54
字数 1507
阅读 19
收藏 1

  文章及代码比较基础,适合初、中级人员,高手略过
  
  阅读此篇文章你可以:
  
  获取一个Django实现增删改查的案例源码
  
  了解数据加密的使用场景和方法以及如何在Python3中使用
  
  背景介绍
  
  DBA需要维护一张密码表,主要记录数据库中创建的账号密码信息,大概如下:
  
  目前的维护方式还是最传统的Excel,一个人更新给多个人同步,Excel设置密码以保证安全性,原始且效率低下,既然我们已经上线了overmind数据库运维系统,何不在系统里边集成这个功能呢?
  
  技术实现
  
  简单分析就可以知道,我们要实现的功能如下:
  
  1.最基础的表单增删改查
  
  2.涉及到密码存储需要加密
  
  update_or_create
  
  表单增删改查大家应该都比较熟悉了,实现方式有很多,我们采用了最简单的view方法来实现,详细内容查看源代码。
  
  代码中用到了Django的一个QuerySet API可能部分人没有用过update_or_create,这里详细介绍下
  
  update_or_create(defaults=None, **kwargs)
  
  看到方法的命名大概也能猜出来这个方法的主要作用就是更新或者创建model数据,那么究竟什么情况下更新?什么情况下创建呢?主要根据传入的**kwargs来判断,defaults为要更新的数据。一句话概括为filter kwargs,create/update defaults
  
  例如对于一张用户表我们要判断username为devops,且email为devops@ops-coffee.cn的用户是否存在,如果不存在则创建这个用户,且设置用户的site为https://ops-coffee.cn,如果存在则更新这个用户的site为https://ops-coffee.cn,则可以这样写
  
  object, created = User.objects.update_or_create(
  
  username='devops',
  
  email='devops@ops-coffee.cn',
  
  defaults={
  
  'username':'devops',
  
  'email':'devops@ops-coffee.cn',
  
  'site':'https://ops-coffee.cn'
  
  }
  
  )
  
  额,上边的例子是不是有点复杂了,拿我们项目里边的实例为例,就是判断id是否存在,如果存在则更新,如果不存在则创建
  
  object, created = Table.objects.update_or_create(
  
  id=postdata.get('id'),
  
  defaults=postdata
  
  )
  
  update_or_create方法返回结果为一个元组(object, created),object为新建或者更新的对象,created为一个布尔值,表示是新建还是更新,True为新建
  
  密码加密
  
  对于密码加密,我们知道加密算法有很多,究竟哪种适合我们呢?
  
  看一下我们的需求,存储的时候要加密存储,但也要能对加密后的数据进行解密以获取原始密码,那么就要求加密算法既支持加密,也支持解密,对于md5这种只支持加密的单向算法就不能选择了,在支持加解密的算法中应用最为广泛的当属RSA了,我们最终也选择了RSA,其实单单对于这个场景来说用3DES之类的对称加密就够了,速度也会快很多,但是考虑到系统里边有其他的加密需求选择RSA能满足更多情景。
  
  RSA加密算法非常复杂,感兴趣的可以查询专业资料,RSA需要一对秘钥称为公钥和私钥,公钥可以对字符串进行加密生成加密字符串,拿私钥可以将加密字符串还原。
  
  python3中RSA的使用
  
  生成RSA秘钥对代码
  
  from Cryptodome.PublicKey import RSA
  
  def create_rsa_key():
  
  '''生成RSA秘钥对'''
  
  try:
  
  # 选择秘钥位数,位数越高越安全,同时加密速度也越慢
  
  key = RSA.generate(2048)
  
  encrypted_key = key.exportKey(pkcs=8)
  
  public_key = key.publickey().exportKey().decode('utf-8')
  
  private_key = encrypted_key.decode('utf-8')
  
  return {'state': 1, 'message': {'public_key': public_key, 'private_key': private_key}}
  
  except Exception as err:
  
  return {'state': 0, 'message': str(err)}
  
  if __name__ == '__main__':
  
  print(create_rsa_key())
  
  执行脚本生成RSA秘钥对,将RSA秘钥对配置在加解密的代码中
  
  RSA加密解密代码
  
  import binascii
  
  from Cryptodome.PublicKey import RSA
  
  from Cryptodome.Cipher import PKCS1_v1_5
  
  class RsaCrypto(www.feifanyule.cn):
  
  '''RSA 加解密'''
  
  def __init__(self):
  
  self.private_key = '''-----BEGIN PRIVATE KEY-----
  
  MIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQDLetN9MfsVWZj2
  
  K+i1vPQqeDKb8Fe52pHKvRtQggTF+x3YRCyk7UNQ27VupohM8t+Qzi2Zm3GnZY5X
  
  H7W8UGLnI1X1ykpWOWVueP3KCA7DCtswDp5hkJgHzPPZC/DlFh0uCpAmUkgHP7WU
  
  XRZoR9mmcVOdWN9c+NWS0JA6cwHSI+J78Edb1lfef5YOwseL2GiOmBiJ7THYfjrw
  
  FwGQaZVjhsp3Pkt7Yt/Huc5NU234wA9j+TFFnubpOrE9mFT8qCkhFhWIEcNsuTqD
  
  DDI9BX0lLaEEn+vg9cnEZ97VgdQQG2D6Ozw4Gldpfoq1XB6BqXg+YsCvyD/h/4QD
  
  LpejZy/VAgMBAAECggEADJkoj6omNevb459Tri+VHS1fUiEEXXZ3QQqKWWa4wu/0
  
  U2030mek8P8EHGYP2avOmcRE4IDWUvCfv9cvxQljxj8oKwABBZZSKGUyBBiRnr6E
  
  /v8OC/5hhgIeNZm0ADW+osN2qgNoKu1lNwVjG3EaEbXB4TkdGJWI1lPhdNelYjby
  
  7/4vnXO7yplSFlDLiqjmEV9Vva3Jf3N3vf92ZfUJg6NHklYDlP+L4unNtS++HKtv
  
  C3TWSz0esVrK67t4Vut+RdKrSQzzWkPAqNwktUavQq6Nb+KMrf9tsQujPZaXkEUn
  
  LUwtVNwhT3BiyPswHN1ycjlP3lN391rnawDQc751dQKBgQDZSFBq1JaGm4zK2YHm
  
  BbxCJ++6l1Qmu9yhk/zic1M/oGoFRdzkeWrYsxhLupp+4PjcCPEiZqivSeJXsFVO
  
  diSjWsBkfO51HRuEzRE2Z/tiTRzJsGAcrBsWwBYNZR/PADG7MEYhIYH0p6Jp3jrq
  
  pNs0f5Gz8XToPi2TQXmRyAltFwKBgQDvvOFlJFfx1ld2wLuZ0w1yMpUoyFYCWSh+
  
  ylREFETod8ufbQxRzvvSA3gFO+xwYZoA+Wq/TyGrfVnN9m4R1goPsQjsuUYQeAIi
  
  MBKmG5znTAmu8dQ5wLKtb10CV0MuFGOSv8xvlccKepY7IDtxOaO410o4PFEjAziU
  
  90b8RiRV8wKBgHDsUD71NTXH6agS2pu9J1YKg2Cp/SYURFoFG0xlO0K6D9+lq2Ni
  
  ZtEwYtQYqup96VgRnaCPUeOntmZ0UiFw7SGorIyNETD0a7TdDrED4XX5NZjsfUbp
  
  ezqbodpcT+e45h+uuwPE8lFAPfxfbqc7/ www.quwanyule157.com mCOXB70whlhFzaMtK27FIsJAoGAVtTJ
  
  qnF8bPpeWYO7Lx7TOu55Ofk9tcIHOc0csj/JKY3iMY80rBjU+p8JBJRMsfOX7Qxp
  
  jnshzdQsB75e5ZTptf9AJUWBzAs7cpiI2KMdtGTFCRlL7dMOpGS2gleK3JDD8+4G
  
  JNBR9EisSyQEg6EF3LgViMLH/G95OfNKQatCE+MCgYEAhRIuEMaL2idD9NKOVdgC
  
  fuSbiP5G69IBVD4uoDYFPQJjxqVOg3pORa8+cJTe+ZFaCkTGV3112eM5Vtm4Vd9Q
  
  pOh7VgJP1l3puZnUoSWGoWansx6aKok5FwuUrZWPjqr/Zrre8XXJyaiR520tuf0i
  
  StMfNAsijJgi2pq2PTMovhE=
  
  -----END PRIVATE KEY-----'''
  
  self.public_key = '''-----BEGIN PUBLIC KEY-----
  
  MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy3rTfTH7FVmY9ivotbz0
  
  Kngym/BXudqRyr0bUIIExfsd2EQspO1DUNu1bqaITPLfkM4tmZtxp2WOVx+1vFBi
  
  5yNV9cpKVjllbnj9yggOwwrbMA6eYZCYB8zz2Qvw5RYdLgqQJlJIBz+1lF0WaEfZ
  
  pnFTnVjfXPjVktCQOnMB0iPie/BHW9ZX3n+WDsLHi9hojpgYie0x2H468BcBkGmV
  
  Y4bKdz5Le2Lfx7nOTVNt+MAPY/kxRZ7m6TqxPZhU/KgpIRYViBHDbLk6gwwyPQV9
  
  JS2hBJ/r4PXJxGfe1YHUEBtg+js8OBpXaX6KtVwegal4PmLAr8g/4f+EAy6Xo2cv
  
  1QIDAQAB
  
  -----END PUBLIC KEY-----'''
  
  def encrypt(self, plaintext):
  
  '''加密方法'''
  
  try:
  
  recipient_key = RSA.import_key(self.public_key)
  
  cipher_rsa = PKCS1_v1_5.new(recipient_key)
  
  en_data =www.michenggw.com cipher_rsa.encrypt(plaintext.encode('utf-8'))
  
  hex_data = binascii.hexlify(en_data).decode('utf-8')
  
  return {'state': 1, 'message'www.mingcheng178.com/: hex_data}
  
  except Exception as err:
  
  return {'state': 0, 'message': str(err)}
  
  def decrypt(self, hex_data):
  
  '''解密方法'''
  
  try:
  
  private_key = RSA.import_key(self.private_key)
  
  cipher_rsa = PKCS1_v1_5.new(private_key)
  
  en_data = binascii.unhexlify(hex_data.encode('utf-8'))
  
  data = cipher_rsa.decrypt(en_data, None).decode('utf-8')
  
  return {'state': 1, 'message': data}
  
  except Exception as err:
  
  return {'state': 0, 'message': str(err)}
  
  if __name__ == '__main__':
  
  print(RsaCrypto().encrypt())
  
  对原始密码加密
  
  >>> _t = RsaCrypto(www.gcyL157.com).encrypt('ops_coffee.cn')
  
  >>> print(_t)
  
  {'state': 1, www.gcyl158.com'message': 'ae3e52eede23a7c9dd348244f0ae90b06c6773e9fecb2383f8195c50e6032742fb793423d75082db9a325b091d3e02351cd04157c68a64a5c130c0eaf7de1396d8993f0d649d1f3c1004119aa221daefca52215a235fb316af313ef64479957264012be20a1d54987386a3f29ae2fe80e147e7eeb770803045cab0d979aa6d5b88c39058f8fba7f6bf06bc436be59a19ccb72ac2813d809132203a64020bbe3c0c3df74befa8b18fb4782e34daff8f6e33e4b45cbe1b2db2be2c3e38a1c9e0e314178ed36a53960017fd9af5f27d99c5e5e0a8d384ac83156598788334248507ac1498fe44b1fb7e3b43e44a8bf3fc189076b16efef2c0f0a86d7faa0
  
  53bbe24'}
  
  获取加密后的字符串
  
  >>> hex_data = _t.get(www.mhylpt.com'message')
  
  >>> print(hex_data)
  
  ae3e52eede23a7c9dd348244f0ae90b06c6773e9fecb2383f8195c50e6032742fb793423d75082db9a325b091d3e02351cd04157c68a64a5c130c0eaf7de1396d8993f0d649d1f3c1004119aa221daefca52215a235fb316af313ef64479957264012be20a1d54987386a3f29ae2fe80e147e7eeb770803045cab0d979aa6d5b88c39058f8fba7f6bf06bc436be59a19ccb72ac2813d809132203a64020bbe3c0c3df74befa8b18fb4782e34daff8f6e33e4b45cbe1b2db2be2c3e38a1c9e0e314178ed36a53960017fd9af5f27d99c5e5e0a8d384ac83156598788334248507ac1498fe44b1fb7e3b43e44a8bf3fc189076b16efef2c0f0a86d7faa053bbe24
  
  对加密后的字符串进行解密
  
  >>> _x = RsaCrypto().decrypt(hex_data)
  
  >>> print(_x)
  
  {'state': 1, 'message': 'ops_coffee.cn'}
  
  页面展示
  
  列表页:列表页使用了datatables插件方便展示,且使用了Django的模板引擎直接渲染
  
  添加:一个简单的功能,这里就在当前页面弹出model弹出框的方式来展现
  
  编辑:添加、编辑、删除都采用前后端分离,ajax异步json数据交互
  
  查看原始密码:实际上是有权限管理的,并非所有用户都能查看原始密码
  
  源码地址
  
  aHR0cHM6Ly9naXRodWIuY29tL29wcy1jb2ZmZWUvZGVtby90cmVlL21hc3Rlci9wYXNzd29yZA==
  
  如果你觉得文章对你有帮助,请转发分享给更多的人。如果你觉得读的不尽兴,推荐阅读以下文章:
  
  Django+Echarts画图实例
  
  Django model转字典的几种方法

© 著作权归作者所有

SEOwhywhy
粉丝 8
博文 155
码字总数 342404
作品 0
私信 提问
Django集成Markdown编辑器【附源码】

专注内容写作的你一定不要错过markdown 简单介绍 markdown是一种标记语言,通过简单的标记语法可以使普通的文本内容具有一定的格式,使用非常简单,学习成本极低 目前各大Blog平台都已支持m...

运维咖啡吧
01/24
38
0
Python自动化开发学习-Django Admin

django amdin是django提供的一个后台管理页面,该管理页面提供完善的html和css,使得你在通过Model创建完数据库表之后,就可以对数据进行增删改查。 准备工作 创建一个项目,或者是用已有的项...

骑士救兵
2018/07/21
0
0
利用Django实现一个博客(附全部源码)

不论什么语言,学Web开发必做的项目——个人博客。 本次项目基于Python的知名Web框架Django,从数据库到视图逻辑、再到模板语法,完整的走了一遍MTV开发流程。 markdown非常适合写博客、新闻...

天涯笨熊
2017/12/14
0
0
第十四章: 会话、用户和注册

第十四章: 会话、用户和注册 是时候承认了: 我们有意的避开了Web开发中极其重要的方面。 到目前为止,我们都在假定,网站流量是大量的匿名用户带来的。 这当然不对。 浏览器的背后都是活生...

阿帆提
2016/11/17
28
0
我们自研的那些Devops工具

随着云技术以及容器技术的崛起,人肉运维的时代结束了 2018年为了解决日常运维中的痛点以及更高效的推进运维工作,我们自研并完善了几个工具系统,这些系统无一例外的帮我们节约了时间,提高...

运维咖啡吧
02/13
1K
4

没有更多内容

加载失败,请刷新页面

加载更多

springboot2.0 maven打包分离lib,resources

springboot将工程打包成jar包后,会出现获取classpath下的文件出现测试环境正常而生产环境文件找不到的问题,这是因为 1、在调试过程中,文件是真实存在于磁盘的某个目录。此时通过获取文件路...

陈俊凯
今天
6
0
BootStrap

一、BootStrap 简洁、直观、强悍的前端开发框架,让web开发更加迅速、简单 中文镜像网站:http://www.bootcss.com 用于开发响应式布局、移动设备优先的WEB项目 1、使用boot 创建文件夹,在文...

wytao1995
今天
10
0
小知识:讲述Linux命令别名与资源文件的区别

别名 别名是命令的快捷方式。为那些需要经常执行,但需要很长时间输入的长命令创建快捷方式很有用。语法是: alias ppp='ping www.baidu.com' 它们并不总是用来缩短长命令。重要的是,你将它...

老孟的Linux私房菜
今天
8
0
《JAVA核心知识》学习笔记(6. Spring 原理)-5

它是一个全面的、企业应用开发一站式的解决方案,贯穿表现层、业务层、持久层。但是 Spring 仍然可以和其他的框架无缝整合。 6.1.1. Spring 特点 6.1.1.1. 轻量级 6.1.1.2. 控制反转 6.1.1....

Shingfi
今天
8
0
Excel导入数据库数据+Excel导入网页数据【实时追踪】

1.Excel导入数据库数据:数据选项卡------>导入数据 2.Excel导入网页数据【实时追踪】:

东方墨天
今天
11
1

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部