对称加密和非对称加密,(https 和 flask 框架中的应用)

密码加密简介

密码存储的主要形式:

  • 明文存储:肉眼就可以识别,没有任何安全性。
  • 加密存储:通过一定的变换形式,使得密码原文不易被识别。

密码加密的几类方式:

  • 明文转码加密:BASE64, 7BIT等,这种方式只是个障眼法,不是真正的加密。

  • 对称算法加密:DES, RSA等。

  • 签名算法加密:也可以理解为单向哈希加密,比如MD5, SHA1等。加密算法固定,容 易被暴力破解。如果密码相同,得到的哈希值是一样的。

  • 加盐哈希加密:加密时混入一段“随机”字符串(盐值)再进行哈希加密。即使 密码相同,如果盐值不同,那么哈希值也是不一样的。现在网站开发中主要是运 用这种加密方法。

 

对称加密的非对称加密的区别?

  • 对称加密:加密解密用的是同样的“钥匙”
  • 非对称加密:加密解密用的是不同的“钥匙”

什么是对称加密技术?

对称加密采用了对称密码编码技术,它的特点是文件加密和解密使用相同的密钥加密

也就是密钥也可以用作解密密钥,这种方法在密码学中叫做对称加密算法,对称加密算法使用起来简单快捷,密钥较短,且破译困难,除了数据加密标准(DES),另一个对称密钥加密系统是国际数据加密算法(IDEA),它比DES的加密性好,而且对计算机功能要求也没有那么高

对称加密算法在电子商务交易过程中存在几个问题:

  1、要求提供一条安全的渠道使通讯双方在首次通讯时协商一个共同的密钥。直接的面对面协商可能是不现实而且难于实施的,所以双方可能需要借助于邮件和电话等其它相对不够安全的手段来进行协商;

  2、密钥的数目难于管理。因为对于每一个合作者都需要使用不同的密钥,很难适应开放社会中大量的信息交流;

  3、对称加密算法一般不能提供信息完整性的鉴别。它无法验证发送者和接受者的身份;

  4、对称密钥的管理和分发工作是一件具有潜在危险的和烦琐的过程。对称加密是基于共同保守秘密来实现的,采用对称加密技术的贸易双方必须保证采用的是相同的密钥,保证彼此密钥的交换是安全可靠的,同时还要设定防止密钥泄密和更改密钥的程序。

  假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。

常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES 

什么是非对称加密技术

与对称加密算法不同,非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。

公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。

 非对称加密的典型应用是数字签名。

   常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)

网站如何通过加密和用户安全通信(HTTPS)

https=http+ssl,两种协议的合体,ssl协议升级版为tls,ssl位于http应用层与tcp中间,注意ssl只保证安全(不被破解),并不保证可靠(即消息是否送达),这一点有tcp保证。

SSL (Secure Sockets Layer) 是用来保障你的浏览器和网站服务器之间安全通信,免受网络“中间人”窃取信息。

SSL原理很简单。当你的浏览器向服务器请求一个安全的网页(通常是 https://)

https流程:

\

服务器就把它的证书和公匙发回来
\
浏览器检查证书是不是由可以信赖的机构颁发的,确认证书有效和此证书是此网站的。
\
 

使用公钥加密了一个随机对称密钥,包括加密的URL一起发送到服务器
\
服务器用自己的私匙解密了你发送的钥匙。然后用这把对称加密的钥匙给你请求的URL链接解密。
\
服务器用你发的对称钥匙给你请求的网页加密。你也有相同的钥匙就可以解密发回来的网页了
\

 

flask内置加密方式: 

介绍Flask密码生成和密码验证的一种通用方法。所使用的函数为Flask框架内 置的函数:generate_password_hash是一个密码加盐哈希函数,生成的哈希值可通过 check_password_hash()进行验证

 

密码生成函数:generate_password_hash

函数定义:

werkzeug.security.generate_password_hash(password, method='pbkdf2:sha1', salt_length=8)

 

哈希之后的哈希字符串格式是这样的:

method$salt$hash

参数说明:

  • password: 明文密码

  • method: 哈希的方式(需要是hashlib库支持的),格式为 pbpdf2:<method>[:iterations]。参数说明:

    • method:哈希的方式,一般为SHA1,
    • iterations:(可选参数)迭代次数,默认为1000。
  • slat_length: 盐值的长度,默认为8。

密码生成示例:

>>> from werkzeug.security import generate_password_hash
>>> print generate_password_hash('123456')
'pbkdf2:sha1:1000$X97hPa3g$252c0cca000c3674b8ef7a2b8ecd409695aac370'

因为盐值是随机的,所以就算是相同的密码,生成的哈希值也不会是一样的。

密码验证函数:check_password_hash

函数定义:

werkzeug.security.check_password_hash(pwhash, password)

check_password_hash函数用于验证经过generate_password_hash哈希的密码 。若密码匹配,则返回真,否则返回假。

参数:

  • pwhashgenerate_password_hash生成的哈希字符串

  • password: 需要验证的明文密码

密码验证示例:

>>> from werkzeug.security import check_password_hash
>>> pwhash = 'pbkdf2:sha1:1000$X97hPa3g$252c0cca000c3674b8ef7a2b8ecd409695aac370'
>>> print check_password_hash(pwhash, '123456')
True

举例说明

from werkzeug.security import generate_password_hash, \
     check_password_hash

class User(object):

    def __init__(self, username, password):
        self.username = username
        self.set_password(password)

    def set_password(self, password):
        self.pw_hash = generate_password_hash(password)

    def check_password(self, password):
        return check_password_hash(self.pw_hash, password)

下面来看看是怎么工作的:

>>> me = User('John Doe', 'default')
>>> me.pw_hash
'sha1$Z9wtkQam$7e6e814998ab3de2b63401a58063c79d92865d79'
>>> me.check_password('default')
True
>>> me.check_password('defaultx')
False

 

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值