单机环境下基于口令的身份认证

Posted caishunzhe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单机环境下基于口令的身份认证相关的知识,希望对你有一定的参考价值。

背景知识

(1)口令字段信息的处理方法

① 接收用户提供的口令Dpw ;

② 生成一个盐值:Dsalt=Arandom( ) ;

③ 生成口令信息:s=Agen(Dsalt,Dpw) ;

④ 把口令信息s 和Dsalt 存入数据库的口令字段中。

(2)口令字段信息的生成算法

① 给口令Dpw 撒盐:Dpw=Asalt(Dsalt,Dpw) ;

② 用撒盐结果做密钥:K=Dpw ;

③ 用一个64 位的全0 的二进制位串构造一个数据块Dp ;

④ 设循环次数初值:i=0 ;

⑤ 对数据块加密:Dc=Acrypt(K,Dp) ;

⑥ Dp=Dc, i=i+1 ;

⑦ 如果i<25 ,则回到⑤;

⑧ 把数据块变换成字符串:s=Atrans(Dc) ;

⑨ 返回s 。

(3)给口令撒盐的算法

① 把盐值附加到口令上:Dtmp=Dpw||Dsalt ;

② 生成哈希值:Dhash=Ahash(Dtmp) ;

③ 以Dhash 作为返回结果。

(4)身份认证算法

① 接收用户提供的账户名Dname 和口令Dpw ;

② 在账户信息数据库中检查Dname 的合法性,如果合法,则找出其对

应的s 和Dsalt ;

③ 生成临时口令信息:sr=Agen(Dsalt,Dpw) ;

④ 如果sr=s ,则认证成功,否则,认证失败。

 

具体操作过程

编写代码pwprocessing.py

import random
import string
#给口令加盐
def addsalt(salt, pw):
    print("Adding salt...")
    pw = pw + salt
    print("Salt added.")
    return hash(pw)
#加密的实现    
def ecrypt(dp, key, i):
    print("Ecrypting data using your password...(round " + str(i+1) + ")")
    for i in range(0, len(dp)):
        index = i % len(key)
        if(key[index] == -):
            dp[i] = str(int(dp[i]) % 10)
        else:
            dp[i] = str((int(dp[i]) + int(key[index])) % 10)
    return dp
#口令字段信息的生成算法
def generate(salt, pw):
    print("Generating data ecrypted by your password...")
    #给口令Dpw 撒盐,用撒盐结果做密钥
    saltedpw = str(addsalt(salt, pw))
    dp = []
    #用一个64 位的全0 的二进制位串构造一个数据块
    for i in range(0, 64):
        dp.append(0)
    #对数据块加密
    for i in range(0, 25):
        dp = ecrypt(dp, saltedpw, i)
    print("Data ecrypted by your password generated.")
    return dp

#创建用户
def createuser(database):
    print("Creating user...")
    print("Input ‘q‘ as username if you want to quit.")
    while(1):
        name = input("username: ")
        if name == q:
            break
        pw = input("password: ")
        salt = ‘‘.join(random.sample(string.ascii_letters + string.digits, 8))
        s = generate(salt, pw)
        dic = {}
        dic[name] = name
        dic[salt] = salt
        dic[pw] = s
        database.append(dic)
        print("User " + name + " is created.")
#直接通过字典匹配用户,检查此用户是否存在
def has_user(database, name):
    for dic in database:
        if dic[name] == name:
            return 1
    return 0
#得到用户的具体信息
def get_info(database, name):
    for dic in database:
        if dic[name] == name:
            salt = dic[salt]
            s = dic[pw]
            return salt, s
#身份认证算法
def authenticate(database):
    print("Authenticating user...")
    print("Input ‘q‘ as username if you want to quit.")
    while(1):
        #接收用户提供的账户名Dname ;
        name = input("username: ")
        if name == q:
            break
        flag = has_user(database, name)
        if flag == 0:
            print("Sorry, user " + name + " does not exist.")
            continue
        #接受用户提供的口令
        pw = input("password: ")
        #在账户信息数据库中检查Dname 的合法性,如果合法,则找出其对
        #应的s 和Dsalt
        salt, s = get_info(database, name)
        #生成临时口令信息
        sr = generate(salt, pw)
        print("Comparing ecrypted data...")
        if(s == sr):
            print("User " + name + " authenticated.")
        else:
            print("Sorry, the password is wrong.")
database = []
createuser(database)
authenticate(database)

创建用户

① 创建第一个用户”csz”,密码为”csz”

 技术图片

② 创建第二个用户”cy”,密码为”cy”

 技术图片

 

 

验证用户

① 输入不存在的用户名”feng”

 技术图片

② 输入用户名”csz”和正确的密码”csz”

 技术图片

③ 输入用户名”cy”和错误的密码”521”

 技术图片

 

③ 输入用户名”cy”和正确的密码”cy”

 技术图片

 

以上是关于单机环境下基于口令的身份认证的主要内容,如果未能解决你的问题,请参考以下文章

基于链路的OSPFMD5口令认证

身份认证和访问控制技术学习-20199319

计算机身份认证和消息认证的区别

路由器配置——基于链路的OSPF简单口令认证

Oracle Data Guard系列:单机环境基于拷贝文件方式搭建DG

6-认证技术原理与应用