2013-04-06 106 views
1

美好的一天。Python输入密码并与暗号密码数据库比较

我试着写一个Python脚本,将捕获的密码,然后比较其 到系统阴影密码。

我使用Ubuntu 12.10进行此测试。并以sudo的方式运行脚本。

def login(user, password): 
    "Check if user would be able to login using password" 
    try: 
     pw1 = spwd.getspnam(user)[1] 
     allus = spwd.getspall() 
     print pw1 
     # pw2 = crypt.crypt(password, pw1[:2]) 
     pw2 = crypt.crypt(password, '\$6\$SALTsalt\$') 
     print pw2 
     return pw1 == pw2 
    except KeyError: 
     return 0 # no such user 

现在上面回报

2 diferent密码,但我得到从阴影的一个。

所以我的问题是如何加密提供的密码,所以我可以把它比作一个 retreived。任何帮助将是要命

编辑插件

def login(user, password): 
"Check if user would be able to login using password" 
try: 
    pw1 = spwd.getspnam(user)[1] 
    allus = spwd.getspall() 
    #  print allus 
    print pw1 
    #  pw2 = crypt.crypt(password, pw1[:2]) 
    # pw2 = crypt.crypt(password, '\$6\$SALTsalt\$') 
pw2 =hashlib.new() 
pw2.update(password) 
pw2.digest() 

    print pw2 
    return pw1 == pw2 
except KeyError: 
    return 0 # no such user 

这也没有工作 怎样才能impliment的haslib获得哈希匹配系统密码

+2

什么是''\ $ 6''?它看起来像破碎的awk代码,绝对不是有用的Python。 – msw 2013-04-06 04:21:24

+0

我从另一个网站获得的6美元收入表明它对于我认为的sha-512有一定的帮助。页面关闭,所以我可以查找。你知道一个不同的方式 – SAShapeShifter 2013-04-06 04:25:16

+0

地穴只使用DES,它是旧的,而不是在Ubuntu中使用。相反,请查看http://docs.python.org/2/library/hashlib.html。 – msw 2013-04-06 04:29:01

回答

2

我如何做出了表率使用阴影密码进行身份验证。我添加了一些评论,让代码自己说话。

一些额外的信息:

还要注意(从隐窝模块文档):

这个模块实现的interfac e到crypt(3)例程,这是基于修改的DES算法的单向散列函数;有关更多详细信息,请参阅Unix手册页。可能的用途包括允许Python脚本接受用户输入的密码,或试图用字典破解Unix密码。

请注意,此模块的行为取决于正在运行的系统中crypt(3)例程的实际实现。因此,当前实现的任何可用扩展也将在此模块上提供。

这也是为什么你不能使用hashlib没有问题。

import crypt # Interface to crypt(3), to encrypt passwords. 
import getpass # To get a password from user input. 
import spwd # Shadow password database (to read /etc/shadow). 

def login(user, password): 
    """Tries to authenticate a user. 
    Returns True if the authentication succeeds, else the reason 
    (string) is returned.""" 
    try: 
     enc_pwd = spwd.getspnam(user)[1] 
     if enc_pwd in ["NP", "!", "", None]: 
      return "user '%s' has no password set" % user 
     if enc_pwd in ["LK", "*"]: 
      return "account is locked" 
     if enc_pwd == "!!": 
      return "password has expired" 
     # Encryption happens here, the hash is stripped from the 
     # enc_pwd and the algorithm id and salt are used to encrypt 
     # the password. 
     if crypt.crypt(password, enc_pwd) == enc_pwd: 
      return True 
     else: 
      return "incorrect password" 
    except KeyError: 
     return "user '%s' not found" % user 
    return "unknown error" 

if __name__ == "__main__": 
    username = raw_input("Username:") 
    password = getpass.getpass() 
    status = login(username, password) 
    if status == True: 
     print("Logged in!") 
    else: 
     print("Login failed, %s." % status) 
+1

非常感谢,非常好。 它像你一样,使学习新语言很好。 – SAShapeShifter 2013-04-08 05:01:27

相关问题