密码加密几种处理方式

1、首先介绍一下常规的登录认证(非安全性)

数据库表如下所示:
在这里插入图片描述
用户通过表单提交用户名,密码两个字段查询数据库匹配,实现登录认证功能,但存在的安全隐患问题太多:

(1)数据库密码以明文的形式进行存储。

(2)数据传输的过程中未对数据进行加密处理。

2、针对以上两个问题进行分析和解决

安全加密:首先对数据库表的password字段进行摘要md5处理,sql语句如下:
在这里插入图片描述
MD5加密后的数据
在这里插入图片描述
l 数据库密码加密后,校验的逻辑就发生了些变化,需要对提交的密码进行加密之后再做对比,但是这样子还是不安全。

(1)通过以上步骤,我们只对数据库的password明文字段进行了简单的MD5加密,进入http://www.cmd5.com/ 输入加密后的密文进行解密后可以得到明文密码
在这里插入图片描述

(2)容易根据密文位数推测算法,从而使用工具破解。

(3)真实密码相同,加密过的密码也相同。

3、接下来我们介绍一下对其进行加盐处理

l 在表中添加一列salt字段(盐),内容随意输入23sd2,然后和原来的明文密码123456结合,再进行md5加密
在这里插入图片描述
在这里插入图片描述
说明:
所谓的salt字段就是一个随机的字段,具体随机算法就不讨论了,每当用户注册账户时,后台就给它随机生成一个不同的字段,然后根据password和salt字段结合进行摘要处理,存在数据库表中的password字段,这样一来,原来明文都是123456生成的密文就不一样了。

以上的步骤我们只是对数据库进行了加密,为了防止用户输入密码在传输的过程中被抓包工具获取,我们还要在密码传输的过程中进行加密,这样可以使得获取到的也是密文。

4、最后介绍下BCrypt加盐加密

  • 经过BCryptPasswordEncoder加密后的内容,不需要专门的salt字段存储盐,而是在密文中。

在这里插入图片描述

  • BCrypt密码图解

在这里插入图片描述

  • Bcrypt有四个变量:

saltRounds: 正数,代表hash杂凑次数,数值越高越安全,默认10次。

myPassword: 明文密码字符串。

salt: 盐,一个128bits随机字符串,22字符

myHash: 经过明文密码password和盐salt进行hash

  • 如何校验正确性

在校验时,从密文中取出盐salt,salt跟password进行hash,得到的结果跟保存在DB中的hash进行比对。

总结:

l 对于用户的密码保护,数据库对敏感的字符内容一定要进行加密之后存储。

l 如果只是单纯的对密码进行加密,密码字符一样会导致加密后的内容也一样,会出现破解一个就可以破解一片的情况。

l 通过对密码加盐(混入随机字符拼接在密码明文中)之后加密,可以增加系统复杂度,得到更强更安全的密文摘要值。

linux服务器加密

# 查看服务器用户密码命令
cat /etc/shadow | grep " + username + " | awk -F \':\' \'{ print $2 }\'
  • 密码段格式

shadow文件中第二列的格式,不同的特殊字符表示特殊的意义:

①.该列留空,即"::",表示该用户没有密码。
②.该列为"!",即":!:",表示该用户被锁,被锁将无法登陆,但是可能其他的登录方式是不受限制的,如ssh公钥认证的方式,su的方式。
③.该列为"",即"::",也表示该用户被锁,和"!“效果是一样的。 ④.该列以”!“或”!!“开头,则也表示该用户被锁。
⑤.该列为”!!",即":!!:",表示该用户从来没设置过密码。
⑥.如果格式为" i d id idsalt h a s h e d " , 则 表 示 该 用 户 密 码 正 常 。 其 中 hashed",则表示该用户密码正常。其中 hashed"id$的id表示密码的加密算法, 1 1 1表示使用MD5算法, 2 a 2a 2a表示使用Blowfish算法," 2 y 2y 2y“是另一算法长度的Blowfish,” 5 5 5“表示SHA-256算法,而” 6 6 6"表示SHA-512算法,
目前基本上都使用sha-512算法的,但无论是md5还是sha-256都仍然支持。 s a l t salt salt是加密时使用的salt,hashed才是真正的密码部分。

在这里插入图片描述

  • 生成密码

MD5 哈希方法:
下文都以生成明文"123456"对应的加密密码为例。
要生成md5算法的密码,使用openssl即可。

openssl passwd -1 '123456'
openssl passwd -1 -salt 'abcdefg' '123456'

SHA-512 哈希方法:
在CentOS 6上,可以借助grub提供的密码生成工具grub-crypt生成。
grub-crypt其实是一个python脚本,交互式生成密码。以下是/sbin/grub-crypt文件的内容:

#! /usr/bin/python

'''Generate encrypted passwords for GRUB.'''

import crypt
import getopt
import getpass
import sys

def usage():
    '''Output usage message to stderr and exit.'''
    print >> sys.stderr, 'Usage: grub-crypt [OPTION]...'
    print >> sys.stderr, 'Try `$progname --help\' for more information.'
    sys.exit(1)

def gen_salt():
    '''Generate a random salt.'''
    ret = ''
    with open('/dev/urandom', 'rb') as urandom:
        while True:
            byte = urandom.read(1)
            if byte in ('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz'
                        './0123456789'):
                ret += byte
                if len(ret) == 16:
                    break
    return ret

def main():
    '''Top level.'''
    crypt_type = '$6$' # SHA-256
    try:
        opts, args = getopt.getopt(sys.argv[1:], 'hv',
                                   ('help', 'version', 'md5', 'sha-256',
                                    'sha-512'))
    except getopt.GetoptError, err:
        print >> sys.stderr, str(err)
        usage()
    if args:
        print >> sys.stderr, 'Unexpected argument `%s\'' % (args[0],)
        usage()
    for (opt, _) in opts:
        if opt in ('-h', '--help'):
            print (
'''Usage: grub-crypt [OPTION]...
Encrypt a password.

  -h, --help              Print this message and exit
  -v, --version           Print the version information and exit
  --md5                   Use MD5 to encrypt the password
  --sha-256               Use SHA-256 to encrypt the password
  --sha-512               Use SHA-512 to encrypt the password (default)

Report bugs to <bug-grub@gnu.org>.
EOF''')
            sys.exit(0)
        elif opt in ('-v', '--version'):
            print 'grub-crypt (GNU GRUB 0.97)'
            sys.exit(0)
        elif opt == '--md5':
            crypt_type = '$1$'
        elif opt == '--sha-256':
            crypt_type = '$5$'
        elif opt == '--sha-512':
            crypt_type = '$6$'
        else:
            assert False, 'Unhandled option'
    password = getpass.getpass('Password: ')
    password2 = getpass.getpass('Retype password: ')
    if not password:
        print >> sys.stderr, 'Empty password is not permitted.'
        sys.exit(1)
    if password != password2:
        print >> sys.stderr, 'Sorry, passwords do not match.'
        sys.exit(1)
    salt = crypt_type + gen_salt()
    print crypt.crypt(password, salt)

if __name__ == '__main__':
    main()

CentOS 7上默认安装的是grub2,它不提供grub-crypt。因此参照grub-crypt内容,使用下面的python语句简单代替grub-crypt,这同样也是交互式的。

python -c 'import crypt,getpass;pw=getpass.getpass();print(crypt.crypt(pw) if (pw==getpass.getpass("Confirm: ")) else exit())'

如果不想交互式,再改成如下形式:

python -c 'import crypt,getpass;pw="aaaaaa";print(crypt.crypt(pw,"$6$ctjpcquqJpj290Ca"))'
  • 6
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
分组密码加密模式是一种将明文分块加密的方法,常见的分组密码加密模式包括以下几种: 1. 电子密码本模式 (Electronic Codebook, ECB):将明文分成固定大小的块,每个块独立地使用相同的密钥进行加密,相同的明文块将产生相同的密文块。由于每个块独立加密,ECB 模式在安全性和抗攻击性方面存在一些问题,因此在实际中较少使用。 2. 密码分组链接模式 (Cipher Block Chaining, CBC):在 CBC 模式中,每个明文块会与前一个密文块进行异或运算,然后再进行加密。这种链接方式使得每个密文块都依赖于之前的所有明文块,提高了安全性。为了保证第一个明文块的安全性,还需要引入初始化向量 (IV)。 3. 密文反馈模式 (Cipher Feedback, CFB):CFB 模式将前一个密文块作为输入与密钥生成器进行加密运算,然后与当前明文块进行异或运算得到当前密文块。这种模式不需要填充明文,可以处理变长的数据。 4. 输出反馈模式 (Output Feedback, OFB):OFB 模式将前一个输出作为输入与密钥生成器进行加密运算,然后与当前明文块进行异或运算得到当前密文块。与 CFB 类似,OFB 也可以处理变长的数据。 5. 计数器模式 (Counter, CTR):CTR 模式将一个计数器与密钥生成器进行加密运算,然后与明文块进行异或运算得到密文块。计数器可以作为输入参数,从而可以并行地加密或解密多个块。 这些分组密码加密模式在实际中根据应用需求和安全性要求的不同选择使用。需要注意的是,在使用这些模式时,必须合理选择和管理密钥和初始化向量,以保证加密的安全性。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值