写点什么

架构师训练营第 11 周作业和感想

用户头像
tuuezzy
关注
发布于: 2020 年 08 月 29 日

作业1:加密解密验证算法

以下做法类似Python的一个库,是最基础的一种带盐值的加密方案。如果追求一些复杂度,比如用户使用手机,还可以用手机的设备ID、用户登录时间作为初始值生成一些随机字符串。

import os
from hashlib import sha256
from hmac import HMAC
import random
import string

'''返回一个set,第一个值是加密后字符串,第二个值是本次使用的盐值'''
def encrypt_password(username, password, salt=None):
"""Hash username + password + salt-value."""
if salt is None:
#salt = os.urandom(12) # 64 bits.
salt_str = ''.join(random.sample(string.ascii_letters + string.digits, 12))
print("saltstr= %s"% salt_str)
else:
assert isinstance(salt, str)
print("saltstr= %s"% salt)
salt_str = salt

assert isinstance(username, str)
assert isinstance(password, str)

# print("salt= %s"%salt)
#encrypt_result = sha256(salt_str + password + username).hexdigest()
#使用username 盐值 密码 连成一个字符串,然后用sha256求其摘要形成存储在数据库的验证字符串
mstr = username + salt_str + password
encrypt_result = sha256(mstr.encode("utf-8")).hexdigest()
print("encrypt_result = %s"% encrypt_result)
return (encrypt_result,salt_str)

def arthorize_password(username, password, stored_hash_str):
splitstr = stored_hash_str.split("*")
stored_username = splitstr[0]
stored_salt = splitstr[1]
stored_encrypt_result = splitstr[2]
#print("The split stored strings are: ",end="")
#print(splitstr)
mstr = username + stored_salt + password
encrypt_result = sha256(mstr.encode("utf-8")).hexdigest()
#print("encrypt_result = %s"% encrypt_result)
return encrypt_result == stored_encrypt_result

#首先模拟将用户的秘钥加密的过程
username = "user1"
encrypted_str_set = encrypt_password(username, password="hello445tty")
encrypted_str = encrypted_str_set[0]
salt = encrypted_str_set[1]
#简单的一个存储示例,将用户名、盐值和摘要值用* 隔开,存储在一起
#由于需要先比较username取出相应的验证字符串,因此username需要单独存储为一个字段
stored_str = username + "*" + salt + "*" + encrypted_str
print("The stored string is: %s" % stored_str)
print("###摘要字符串已经生成###\n\n")

#模拟一个输入密码并验证的过程
stored_username = username
username = "user1"
stored_encrypted_str = stored_str
'''
此处有从数据库中取出和username字符串相同值的stored_username的过程
'''
input_password = "hello445tty"
result = arthorize_password(username, input_password, stored_encrypted_str)
print("username: %s passowrd: %s"% (username, input_password))
print("验证成功") if result else print("验证失败")

result = arthorize_password(username, "anoterpassword", stored_encrypted_str)
print("username: %s passowrd: %s"% (username, "anoterpassword"))
print("验证成功") if result else print("验证失败")

本周感想:

安全是一个很重要的话题。作为软件工程师和架构师,目前已经不得不学习足够的、必要的安全知识,来完善自己的工作。也就是说,如果你做软件开发,或者搞系统架构设计,如果不懂足够多的安全知识,就等着把大家带到沼泽里面去吧。

说2个案例。

1、我们去和另一个平台谈SSO认证的事情,所谓SSO,就是单点登录,希望是从我方平台登录之后,可以被另一个平台“大V”信任,那么用户可以直接跑到大V上浏览或者发言。大V给了我们一个文档,我们照此开发。奇怪的是,文档上面的SSO互信方案非常简单,甚至已经达到了可以直接攻击的地步,简单的字符串拼接和MD5摘要,形成传递字符串,然后HTTP下,get方式调用……这么简单吗?

简单的唯一好处,就是不必编程也能验证。我们回到公司拼接了一个字符串一试,不成功。奇怪了。验证多次都不对。没办法,打电话和发邮件过去,要求对方查证怎么回事。

对方过了2天轻描淡写的回复:这个文档已经作废了。至于现在怎么认证SSO的,我不知道。

我倒……大哥,项目工期催得紧啊,你给点面子看看代码吧?

对方义正言辞的回复:看不懂,我们目前据说正在开发新的SSO机制,你等新的机制开发完了再来谈吧。

一万匹、一万批草泥马就这样经过了……

2、某集团公司内部搞安全保障演练,重视程度很高。

问题是重视程度高,不等于目前工作水平高,各单位都比较害怕,不知道集团组织什么样子的攻击和扫描。

各单位如果被兄弟单位检查出漏洞,被举报,举报者有加分,被举报者要扣分且比一般的攻击扣分多。如果匿名举报,举报者就不加分了。

这不是怂恿鼓励大家玩窝里反吗?

A公司的几个技术部门的很多人收到一封邮件,标题是“安全演练情况**月**日通报”,有个word文档附件。于是很多人下载了附件,打开,于是……被安装了木马,开始本机扫描和内网侦听。有些信息被拿走,有些主机被开放了权限被攻破。这是典型的社会工程学攻击方式啊,但是很多人连社会工程学是什么还都不甚了解呢。

次日举报信就被发到集团演练工作组,马上扣分……

A公司慨叹:“墙总是从内部被攻破更容易……”

兄弟公司惊呼:“家贼难防!”



发布于: 2020 年 08 月 29 日阅读数: 47
用户头像

tuuezzy

关注

还未添加个人签名 2017.10.17 加入

还未添加个人简介

评论

发布
暂无评论
架构师训练营第 11周作业和感想