57个挑战之55服务加密实现

57个挑战之55服务加密实现

接昨天,发现在python3里面,2次提供相同的url,hash的数值的确是不一致的。google 了一下,发现这个是Python 为了防止恶意攻击做的一个操作。

下面蓝框,如果要解除这个问题,建议使用hashlib 模块。

好吧,直接找了下它的实现:

https://docs.python.org/3/library/hashlib.html

比较喜欢这个blake2b的实现,指定长度,而且加入key 防止被暴力破解。

把这段代码引入到 昨天的代码中,问题解决。贴代码

import redisimport reimport jsonimport timeimport cgifrom redis import StrictRedis, ConnectionPoolfrom flask import Flask,jsonify,requestimport requestsfrom hashlib import blake2bapp = Flask(__name__)def create_url(): print(“Come to the function create_url()”) prefix = “http://127.0.0.1/api/url/” suffix = time.strftime(“%Y-%m-%d-%H:%M:%S”, time.localtime()) url = prefix + suffix print(url) print(“Come out of the function create_url()”) return urldef dohash(url): print(“—-come to function— dohash(url)”) FILES_HASH_PERSON = b’57challenges’ #设置一个key h = blake2b(digest_size=10,person=FILES_HASH_PERSON) #设置加密长度及指定key h.update(url.encode()) primkey = h.hexdigest() print(“the hash of {0} is {1}”.format(url,primkey)) print(“—-come out of function— dohash(url)”) return primkeydef insert_into_redis(primkey,textcontent): #mock 把数据插入数据库,primkey 和 textcontent print(“—-come to function— insert_into_redis(primkey,textcontent)”) pool = ConnectionPool(host=’localhost’, port=6379, db=0, decode_responses=True) r = StrictRedis(connection_pool=pool) try: r.hset(“document”, primkey, json.dumps({“content”: textcontent})) except: return 0 print(“—-come out of function— insert_into_redis(primkey,textcontent)”) return 1def check_url_if_exist(url): # mock检查逻辑 print(“—-come to function—check_url_if_exist(url)”) print(“The received url is {0}”.format(url)) key = dohash(url) print(“to search this key {0},check if it exist”.format(key)) pool = ConnectionPool(host=’localhost’, port=6379, db=0, decode_responses=True) r = StrictRedis(connection_pool=pool) if r.hexists(“document”,key): result = 1 print(“it exist”) else: result = 0 print(“it not exist”) print(“—-come out of function—check_url_if_exist(url)”) return resultdef get_text(url): print(“—-come to function—get_text(url)”) pool = ConnectionPool(host=’localhost’, port=6379, db=0, decode_responses=True) r = StrictRedis(connection_pool=pool) key = dohash(url) textinfojson = r.hmget(“document”,key) print(textinfojson) #debug , 整个信息内容展示 print(type(textinfojson)) # 看看类型,原来是List print(textinfojson[0]) # 展示list 中第一个元素内容 print(type(textinfojson[0])) # 看看类型是str print(json.loads(textinfojson[0])[“content”]) #把str 类型转为字典,并读取字典里面key 为”content”的内容 textinfo = json.loads(textinfojson[0])[“content”] print(“—-come out of function—get_text(url)”) return textinfo”””1.保存文档功能逻辑:接收前端请求,把文字存到数据库,并返回成功信息到后端。输入: {“text”: “this is the info for test”}输出: {“info”: “information has been successful saved”} 功能逻辑:1. 获取输入 2. 把输入的text 文档生成一个url3. 把URL 做hash ,并把hash(url)作为key4. 把{hash(url): text} 存入数据库5. 如果存储成功,则返回信息给到客户端redis 表结构设计: {md5(url): text} “””@app.route(‘/api/storedoc’,methods=[‘POST’])def store_doc(): textcontent = request.json[‘text’] # 获取输入 url = create_url() primkey = dohash(url) if insert_into_redis(primkey,textcontent) == 1: info =” insert into redis key {0} {1} pair success”.format(url,textcontent) else: info = “something error has happened” return jsonify({“info”:info})”””2.编辑文档:功能逻辑: 收集客户端的编辑请求,进入url 并找到对应的数据,把text 数据展示在前端,输入:{“edit”: “http://127.0.0.1/api/202206100906”}输出:{“textinfo”:”this is the info for test”}供客户端逻辑把这个text 数据做展示。2-1: 接收输入的URL2-2: 把URL做hash,并到数据库查找数据2-3: 如果存在则返回数据,如果不存在则返回信息告诉不存在 result = 0″””@app.route(‘/api/editdoc’,methods=[‘POST’])def edit_doc(): url = request.json[‘edit’] print(“We have got the input url, it’s {0}”.format(url)) if check_url_if_exist(url) == 1: textinfo = get_text(url) print(” info: the text info is {0}”.format(textinfo)) return jsonify({“info”: “the url is exist”,”url”:url}) else: return jsonify({“info”: “the url {0} is not exist”.format(url)})if __name__ == ‘__main__’: app.run(host=’0.0.0.0′,port=8008,debug = True)

前端插入效果

后台信息:

看到key 是这个 9265 结尾的。

我用同一个url链接,反向找下对应的数值:

后端的日志:key 没变

操作三次,查看数据库,信息是完备的。

郑重声明:本文内容及图片均整理自互联网,不代表本站立场,版权归原作者所有,如有侵权请联系管理员(admin#wlmqw.com)删除。
(0)
用户投稿
上一篇 2022年6月14日
下一篇 2022年6月14日

相关推荐

  • 5款公认“无差评”的手机,价格覆盖高中低档三档,闭眼入手即可

    最近,有不少朋友在问我,手机什么牌子好。其实,这个问题很难回答,因为每个人的喜好不同。不过,我可以推荐几款公认的“无差评”手机,价格覆盖高中低档三档。 如果你正在寻找一部性价比极高…

    2022年7月2日
  • 如何扩大使用数字人民币?专家这样说

    随着新一轮技术革命的深入推进,世界经济驶入数字经济快车道,生产、生活方式加速数字化转型,推动支付方式以及支付手段数字化。数字货币是国际货币体系改革的重要方向。优先发行、使用数字人民…

    2022年8月3日
  • 从通信到安全通信,我们为什么需要量子通信?

    图片来源@视觉中国 文 陈根 从贝尔实验室开始,到硅谷的崛起,再到电子计算机和遍布全球的互联网,人类文明正在一步一步地全面进入信息时代。不过,目前的常规通信多采用加密技术解决安全通…

    2022年9月24日
  • 换换回收:3分钟带你揭秘二手手机是如何质检

    很多用户在选择线上回收手机时,其实一直很好奇自己的手机寄到平台之后是如何回收的,特别是质检环节,到底要经过哪些步骤,会不会对手机动手动脚,故意弄坏手机,今天换换回收就带你揭秘一下手…

    2022年7月6日
  • C# 中使用泛型约束来限制类型参数范围

    在定义泛型类型时,可以指定一个或者多个约束来限制泛型参数的范围。在实例化一个泛型类型时,若提供的类型不满足约束要求,编译器就会报错。 new() 约束 new 约束要求类型参数必须…

    2022年7月1日
  • 变革中的政务云

    当前,政务云市场发展如火如荼。 2022年6月,赛迪顾问发布的《2021-2022年中国政务云市场研究年度报告》(以下简称《报告》)指出,得益于数字政府建设持续推进,以及疫情防控常…

    2022年6月24日
  • 血压、心率、心电图都能测!Dido Y1智能手环上手体验

    日常996,加班007。 越来越快的工作节奏已经不仅仅是IT行业的专属形象,传统制造业,服务业也纷纷内卷。当下年轻人工作压力越来越大已经是共识。 年轻一代长期在快节奏,高压力下工作…

    2022年7月21日
  • Nature发表空间seq技术,捕获空间表观遗传信息

    组织中的细胞功能取决于它们所在的局部环境。空间转录组学的出现让基因组规模的基因表达映射成为可能,但缺乏在细胞水平和基因组规模上捕获空间表观遗传信息的能力。 如今,来自耶鲁大学和卡罗…

    2022年8月24日
  • 加快制造业数字化转型,智能工厂到底有什么好?

    传统制造型企业的车间设备大部分都使用了很多年,主要的问题就是老旧设备无法自动采集数据,以至于管理者必须依靠员工汇报才能获取到车间生产情况,信息滞后不说,还容易出现数据错误。如果传统…

    2022年6月17日
  • 微信朋友圈可以批量删除吗(直接清空朋友圈的方法)

    很多人都会有这样的经历,就是过了一段时间后发现之前发的朋友圈内容有点幼稚,或者之前发了点朋友圈广告想要删除了,但是又找不到批量删除的方法,常规进入自己朋友圈,点击自己发的朋友圈进入…

    2022年4月14日

联系我们

联系邮箱:admin#wlmqw.com
工作时间:周一至周五,10:30-18:30,节假日休息