在我们日常开发运维平台中,如果公司对安全要求比较高,一般数据库中都存储的都是用户加密后的密码,这样即使某些人侥幸得到数据库权限,也无法得知用户明文密码,这主要是从安全角度来考虑的,那如何将用户输入的明文密码转为加密后的密码呢? 我们今天这篇文章就给出一个小例子,让大家看看如何实现,按惯例,我们先上代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 |
#!/usr/local/env python import sys import hashlib import getpass import sqlite3 def user_info(): info = [] user_name = raw_input('Please Enter a User Name: ') password = hashlib.sha224(getpass.getpass('Please Enter a Password: ')).hexdigest() info.append((user_name, password)) return info def main(): info = user_info() try: conn = sqlite3.connect('pub.db') cu = conn.cursor() sql = ''' insert into USER values (?,?) ''' cu.execute(sql, info[0]) conn.commit() except: sys.exit('error!') if __name__ == "__main__": main() |
脚本逐行解释, 前几行是导入的标准模块,hashlib模块作用是生成密码散列和消息摘要,getpass模块是用户输入密码,不在控制台回现,sqlite3模块是python与sqlite库交互的接口。脚本再往下是定义了2个函数,user_info()函数是得到用户输入信息,main()函数将用户输入的信息加密入库,hashlib.sha224是单向散列算法,sha是安全散列算法缩写(Secure Hash Algorithm),另外还有SHA-1,SHA-224,SHA-256,SHA-384,和SHA-512这几种散列算法(大家都可以试试,直观印象是数字越大加密后得到的字符串越长),hexdigest()函数返回字符串的摘要,并且摘要是一系列16进制数字。其它行就不说了,都是之前我们见过的内容,这样在数据库中存储的就是加密后的密码了,这篇就到这里了,那现在我们已经有了存储用户信息的库,那下篇我们来看看如何对用户的输入的用户名和密码进行验证。