国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

Django開發(fā)密碼管理表實例教程(附源碼)

2020-01-04 13:54:55
字體:
來源:轉載
供稿:網(wǎng)友

閱讀此篇文章你可以:

  • 獲取一個Django實現(xiàn)增刪改查的案例源碼
  • 了解數(shù)據(jù)加密的使用場景和方法以及如何在Python3中使用

背景介紹

DBA需要維護一張密碼表,主要記錄數(shù)據(jù)庫中創(chuàng)建的賬號密碼信息,大概如下:

Django,密碼管理表,源碼

目前的維護方式還是最傳統(tǒng)的Excel,一個人更新給多個人同步,Excel設置密碼以保證安全性,原始且效率低下,既然我們已經(jīng)上線了overmind數(shù)據(jù)庫運維系統(tǒng),何不在系統(tǒng)里邊集成這個功能呢?

技術實現(xiàn)

簡單分析就可以知道,我們要實現(xiàn)的功能如下:

1.最基礎的表單增刪改查

2.涉及到密碼存儲需要加密

update_or_create

表單增刪改查大家應該都比較熟悉了,實現(xiàn)方式有很多,我們采用了最簡單的view方法來實現(xiàn),詳細內容查看源代碼。

代碼中用到了Django的一個QuerySet API可能部分人沒有用過update_or_create,這里詳細介紹下

update_or_create(defaults=None, **kwargs)

看到方法的命名大概也能猜出來這個方法的主要作用就是更新或者創(chuàng)建model數(shù)據(jù),那么究竟什么情況下更新?什么情況下創(chuàng)建呢?主要根據(jù)傳入的**kwargs來判斷,defaults為要更新的數(shù)據(jù)。一句話概括為filter kwargs,create/update defaults

例如對于一張用戶表我們要判斷username為devops,且email為devops@ops-coffee.cn的用戶是否存在,如果不存在則創(chuàng)建這個用戶,且設置用戶的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是否存在,如果存在則更新,如果不存在則創(chuàng)建

object, created = Table.objects.update_or_create( id=postdata.get('id'), defaults=postdata)

update_or_create方法返回結果為一個元組(object, created),object為新建或者更新的對象,created為一個布爾值,表示是新建還是更新,True為新建

密碼加密

對于密碼加密,我們知道加密算法有很多,究竟哪種適合我們呢?

看一下我們的需求,存儲的時候要加密存儲,但也要能對加密后的數(shù)據(jù)進行解密以獲取原始密碼,那么就要求加密算法既支持加密,也支持解密,對于md5這種只支持加密的單向算法就不能選擇了,在支持加解密的算法中應用最為廣泛的當屬RSA了,我們最終也選擇了RSA,其實單單對于這個場景來說用3DES之類的對稱加密就夠了,速度也會快很多,但是考慮到系統(tǒng)里邊有其他的加密需求選擇RSA能滿足更多情景。

RSA加密算法非常復雜,感興趣的可以查詢專業(yè)資料,RSA需要一對秘鑰稱為公鑰和私鑰,公鑰可以對字符串進行加密生成加密字符串,拿私鑰可以將加密字符串還原。

python3中RSA的使用

生成RSA秘鑰對代碼

from Cryptodome.PublicKey import RSAdef create_rsa_key(): '''生成RSA秘鑰對''' try:  # 選擇秘鑰位數(shù),位數(shù)越高越安全,同時加密速度也越慢  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())

執(zhí)行腳本生成RSA秘鑰對,將RSA秘鑰對配置在加解密的代碼中

RSA加密解密代碼

import binasciifrom Cryptodome.PublicKey import RSAfrom Cryptodome.Cipher import PKCS1_v1_5class RsaCrypto(): '''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/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 = cipher_rsa.encrypt(plaintext.encode('utf-8'))   hex_data = binascii.hexlify(en_data).decode('utf-8')   return {'state': 1, 'message': 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().encrypt('ops_coffee.cn')>>> print(_t){'state': 1, 'message': 'ae3e52eede23a7c9dd348244f0ae90b06c6773e9fecb2383f8195c50e6032742fb793423d75082db9a325b091d3e02351cd04157c68a64a5c130c0eaf7de1396d8993f0d649d1f3c1004119aa221daefca52215a235fb316af313ef64479957264012be20a1d54987386a3f29ae2fe80e147e7eeb770803045cab0d979aa6d5b88c39058f8fba7f6bf06bc436be59a19ccb72ac2813d809132203a64020bbe3c0c3df74befa8b18fb4782e34daff8f6e33e4b45cbe1b2db2be2c3e38a1c9e0e314178ed36a53960017fd9af5f27d99c5e5e0a8d384ac83156598788334248507ac1498fe44b1fb7e3b43e44a8bf3fc189076b16efef2c0f0a86d7faa053bbe24'}

獲取加密后的字符串

>>> hex_data = _t.get('message')>>> print(hex_data)ae3e52eede23a7c9dd348244f0ae90b06c6773e9fecb2383f8195c50e6032742fb793423d75082db9a325b091d3e02351cd04157c68a64a5c130c0eaf7de1396d8993f0d649d1f3c1004119aa221daefca52215a235fb316af313ef64479957264012be20a1d54987386a3f29ae2fe80e147e7eeb770803045cab0d979aa6d5b88c39058f8fba7f6bf06bc436be59a19ccb72ac2813d809132203a64020bbe3c0c3df74befa8b18fb4782e34daff8f6e33e4b45cbe1b2db2be2c3e38a1c9e0e314178ed36a53960017fd9af5f27d99c5e5e0a8d384ac83156598788334248507ac1498fe44b1fb7e3b43e44a8bf3fc189076b16efef2c0f0a86d7faa053bbe24

對加密后的字符串進行解密

>>> _x = RsaCrypto().decrypt(hex_data)>>> print(_x){'state': 1, 'message': 'ops_coffee.cn'}

頁面展示

列表頁:列表頁使用了datatables插件方便展示,且使用了Django的模板引擎直接渲染

Django,密碼管理表,源碼

添加:一個簡單的功能,這里就在當前頁面彈出model彈出框的方式來展現(xiàn)

Django,密碼管理表,源碼

編輯:添加、編輯、刪除都采用前后端分離,ajax異步json數(shù)據(jù)交互

Django,密碼管理表,源碼

查看原始密碼:實際上是有權限管理的,并非所有用戶都能查看原始密碼

Django,密碼管理表,源碼

源碼地址:https://github.com/ops-coffee/demo/tree/master/password

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對VEVB武林網(wǎng)的支持。


注:相關教程知識閱讀請移步到python教程頻道。
發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 泰来县| 库尔勒市| 苍山县| 罗江县| 枣强县| 吴川市| 荆州市| 碌曲县| 同江市| 桐庐县| 包头市| 宣化县| 周至县| 甘孜| 安宁市| 德州市| 日土县| 台江县| 文昌市| 扶余县| 保山市| 鄂托克前旗| 澄城县| 呼和浩特市| 台湾省| 响水县| 梅州市| 灵台县| 沈阳市| 海城市| 太仓市| 东至县| 界首市| 新乡市| 安福县| 连江县| 肇庆市| 黔西县| 集贤县| 上栗县| 石屏县|