hashlib
- クロールパスワード送信を防止するため、
- 暗号化された文字、カスタムに対応する文字コード表
- 元は文字0と1に変換され、今では文字が別の文字にあります
import hashlib
m = hashilib.md5() # 相比其他的编码比较难破解
# pwd = b'helloworld' # 得先处理成二进制
pwd = 'helloworld'.encode(utf-8) # 这样也可以
m.update(pwd)
print(m.hexdigest())
fc5e038d38a57032085441e7fe7010b0
- 暗号ハッシュ後の長さが同じです
- その結果をハッシュ同じことの暗号化は、同じです
- あなたは同じ文字エンコーディングのハッシュテーブル、常にハッシュを使用している場合は、彼の結果が蓄積されます
# 两个密码的长度相差甚远,但是加密后的长度是相同的
m = hashlib.md5()
pwd = b'123'
m.update(pwd)
print(m.hexdigest())
m = hashlib.md5()
pwd = b'asdhadjadaldj'
m.update(pwd)
print(m.hexdigest())
# 加密的内容一样,获得哈希的结果也是相同的
m = hashlib.md5()
pwd = b'123'
m.update(pwd)
print(m.hexdigest())
202cb962ac59075b964b07152d234b70
a397e9b17ab515acdc59044b687f8c9f
202cb962ac59075b964b07152d234b70
# 使用同一个md5, 一直update,结果是累加的
# update(b'123')再update(b'456')和update('123456')的结果是一样的
m = hashlib.md5()
pwd = b'123'
m.update(pwd)
m.update(b'456')
print(m.hexdigest())
e10adc3949ba59abbe56e057f20f883e
e10adc3949ba59abbe56e057f20f883e
def break_pwd(hash_pwd):
for pwd in pwd_list:
m = hashlib.md5()
m.update(pwd.encode('utf-8'))
if m.hexdigest() == hash_pwd:
return pwd
if __name__ == '__main__':
# 密码hash后的值
hash_pwd = '0562b36c3c5a3925dbe3c4d32a4f2ba2'
pwd = break_pwd(hash_pwd)
print('这个傻逼用户的密码是:', pwd)
这个傻逼用户的密码是: hash123456
HMAC
- ヒットライブラリーを防ぐために、
- 塩
- すべてのプロパティはhashlibを持っています
import hmac
m = hmac.new(b'123') # 加盐处理
m.update(b'123')
m.update(b'456')
print(m.hexdigest()) # a31dce88633f3393f6c475525ff48301
m =hmac.new(b'123')
m.update(b'123456')
print(m.hexdigest()) # a31dce88633f3393f6c475525ff48301
- 異なる塩処理、同じ暗号化されたコンテンツは、結果は同じではありません
m = hmac.new(b'123')
m.update(b'123')
m.update(b'456')
print(m.hexdigest()) # a31dce88633f3393f6c475525ff48301
m = hmac.new(b'12')
m.update(b'123456')
print(m.hexdigest()) # 85f7e2aa1088bef00800f8bb95330117
UUID
- それは時間に応じて生成されるので、繰り返されることはありません
import uuid
for i in range(4):
print(uuid.uuid4())
1d1d1c6c-95c0-43ac-9e90-fbd92e8532d7
a51b5dd6-06ba-4a48-a191-d50b305352e6
dc3129d1-a9e7-4f7f-adc0-7c3c46a64261
f406a738-d9c8-440d-b9a2-5219d3241f5a
ロギング
- 日記(毎日何か重要な記録)の同等が、ログ(プログラムに関する記録情報)のより
- 情報(何の問題) - >デバッグ(問題なく) - >警告が(行われていないが、必要はありませんすることができます) - >エラー(実行する必要があります) - >クリティカル(クラッシュ)
V1
import logging
name = 'nick'
total_prize = '66666'
logging.info(f'{name}消费了{total_prize}元') # 等级10
logging.debug(f'{name}消费了{total_prize}元') # 20
logging.warning(f'{name}消费了{total_prize}元') # 30
logging.error(f'{name}消费了{total_prize}元') # 40
logging.critical(f'{name}消费了{total_prize}元') # 50
WARNING:root:nick消费了15000元
ERROR:root:nick消费了15000元
CRITICAL:root:nick消费了15000元
- 欠点は、このように:
- あなたはログをファイルに保存することはできません
- 物事は、30件の以上のレコードをすることはできません
v2の
logging.basicConfig(filename='access.log', # 指定日志保存的文件名
format='%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s', # 指定日志的格式
datefmt='%Y-%m-%d %H:%M:%S %p', # 时间
level=10) # 控制保存的最低等级
name = 'nick'
total_prize = '10000'
logging.info(f'{name}消费了{total_prize}元') # 10
logging.debug(f'{name}消费了{total_prize}元') # 20
logging.warning(f'{name}消费了{total_prize}元') # 30
logging.error(f'{name}消费了{total_prize}元') # 40
logging.critical(f'{name}消费了{total_prize}元') # 50
- 欠点は、このように:
- 異なるプロジェクトは異なる、より少ない柔軟に対処するために
- ファイルに書き込まれている、あなたが印刷できない、制御性が悪いです
- すべてのパラメータが固定されています。
V3
- ロガーあなたは、ログのバージョン
- フィルタリングしたまま
- ハンドラは、ファイルに保存されている、または画面に出力されます
- フォーマッタ制御形式のログ
# 1. logger
logger = logging.getLogger('shop')
# 2. filter,不用管
# 3. handler
t1 = logging.FileHandler('ti.log') # 往文件中打印
t2 = logging.FileHandler('t2.log')
sm = logging.StreamHandler() # 往屏幕上打印
# 4. formatter,复制粘贴
f1 = logging.Formatter('%(asctime)s - %(name)s - %(levelname)s -%(module)s: %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p', )
f2 = logging.Formatter('%(asctime)s : %(message)s',
datefmt='%Y-%m-%d %H:%M:%S %p', )
f3 = logging.Formatter('%(name)s %(message)s', )
# 5. formatter绑定到handler中去
t1.setFormatter(f1)
t2.setFormatter(f2)
sm.setFormatter(f3)
# 6. handler绑定到logger中
logger.addHandler(t1)
logger.addHandler(t2)
logger.addHandler(sm)
# 7. 设置打印的级别
logger.setLevel(10) # 全部的最低等级,先走这个,再走单个的,如果不设置的话默认是30
t1.setLevel(30)
t2.setLevel(50)
sm.setLevel(40)
# 8. 测试
logger.info('12345')
logger.debug('12345')
logger.warning('12345')
logger.error('12345')
logger.critical('12345')
これを読んで、上記のように見ていません
import os
import logging.config
# 定义三种日志输出格式 开始
standard_format = '[%(asctime)s][%(threadName)s:%(thread)d][task_id:%(name)s][%(filename)s:%(lineno)d]' \
'[%(levelname)s][%(message)s]' # 其中name为getLogger()指定的名字;lineno为调用日志输出函数的语句所在的代码行
simple_format = '[%(levelname)s][%(asctime)s][%(filename)s:%(lineno)d]%(message)s'
id_simple_format = '[%(levelname)s][%(asctime)s] %(message)s'
# 定义日志输出格式 结束
logfile_dir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) # log文件的目录,需要自定义文件路径 # atm
logfile_dir = os.path.join(logfile_dir, 'log') # C:\Users\oldboy\Desktop\atm\log
logfile_name = 'log.log' # log文件名,需要自定义路径名
# 如果不存在定义的日志目录就创建一个
if not os.path.isdir(logfile_dir): # C:\Users\oldboy\Desktop\atm\log
os.mkdir(logfile_dir)
# log文件的全路径
logfile_path = os.path.join(logfile_dir, logfile_name) # C:\Users\oldboy\Desktop\atm\log\log.log
# 定义日志路径 结束
# log配置字典
LOGGING_DIC = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'standard': {
'format': standard_format
},
'simple': {
'format': simple_format
},
},
'filters': {}, # filter可以不定义
'handlers': {
# 打印到终端的日志
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler', # 打印到屏幕
'formatter': 'simple'
},
# 打印到文件的日志,收集info及以上的日志
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler', # 保存到文件
'formatter': 'standard',
'filename': logfile_path, # 日志文件
'maxBytes': 1024 * 1024 * 5, # 日志大小 5M (*****)
'backupCount': 5,
'encoding': 'utf-8', # 日志文件的编码,再也不用担心中文log乱码了
},
},
'loggers': {
# logging.getLogger(__name__)拿到的logger配置。如果''设置为固定值logger1,则下次导入必须设置成logging.getLogger('logger1')
'': {
# 这里把上面定义的两个handler都加上,即log数据既写入文件又打印到屏幕
'handlers': ['default', 'console'],
'level': 'DEBUG',
'propagate': False, # 向上(更高level的logger)传递
},
},
}
def load_my_logging_cfg():
logging.config.dictConfig(LOGGING_DIC) # 导入上面定义的logging配置
logger = logging.getLogger(__name__) # 生成一个log实例
logger.info('It works!') # 记录该文件的运行状态
if __name__ == '__main__':
load_my_logging_cfg()
- そして、前記ログ取得経路の辞書は、いくつかのパラメータを変更するように構成することができます