
利用redis实现多层安全性:设置多个密码

在现代网络环境中,安全性是一个不可忽视的问题。为了保障数据的安全,各种安全技术被设计和实现。在实际网络环境中使用较多的是密码学技术。这里介绍使用Redis实现多层安全性的方式:设置多个密码。
Redis是一款高性能的内存数据库,常用于缓存、存储等场景。Redis的优势之一就是实现简单,更重要的是可以使用密码保护机制来保护数据的安全性。Redis的密码保护相对于其他技术而言是一种良好的解决方案。而允许设置多个密码则让数据的安全性更加得到保障。

安全性方案
Redis提供了一种密码保护机制,可以为 Redis 设置一个密码,这个密码需要在登录时输入,因此影响到 Redis 服务的所有操作,包括读、写、删除等操作。但是当 Redis 数据库被攻击者盗取后,密码就暴露了,攻击者就可以使用该密码恶意篡改数据。为了应对这样的问题,可以设置多个密码,每个密码仅仅可以处理一种操作。
以下是基于Python实现的安全性方案:
#!/usr/bin/env python#coding=utf-8import redisclass RedisWithMultiPasswords(redis.StrictRedis):def __init__(self, password_dict, **kwargs):redis.StrictRedis.__init__(self, **kwargs)self.password_dict = password_dictdef execute_command(self, *args, **options):password_key = options.get('_redis_pwd_key', None)password = self.password_dict[password_key] if password_key else Noneif password:try:options['password'] = passwordreturn redis.StrictRedis.execute_command(self, *args, **options)except redis.exceptions.ResponseError as e:#寻找一个管理员密码for key in self.password_dict:if 'manager' in key:options['password'] = self.password_dict[key]try:redis.StrictRedis.execute_command(self, *args, **options)returnexcept redis.exceptions.ResponseError as e:passrse edef execute(self, command, *args, **options):if command in ('AUTH', 'PING', 'QUIT'):return redis.StrictRedis.execute(self, command, *args, **options)try:return self.execute_command(command, *args, **options)except redis.exceptions.ResponseError as e:if 'NOAUTH Authentication required' in str(e):try:self.execute_command('AUTH', 'default')except redis.exceptions.ResponseError as e:passreturn self.execute_command(command, *args, **options)else:rse e
例子启动方法:
#!/usr/bin/env python#coding=utf-8import redisfrom RedisWithMultiPasswords import RedisWithMultiPasswordsredis_config = {'host': 'localhost', 'port': 6379}password_dict = {'manager_pwd': '1234567890', 'writer_pwd': 'qwertyuiop', 'editor_pwd': 'asdfghjkl', 'reader_pwd': 'zxcvbnm' }redis_client = RedisWithMultiPasswords(password_dict, **redis_config)redis_client.execute_command('set', 'test', 'hello world!', _redis_pwd_key='writer_pwd')redis_client.execute_command('set', 'test', 'hello edit!', _redis_pwd_key='editor_pwd')res = redis_client.execute_command('get', 'test', _redis_pwd_key='reader_pwd')print(res)
RedisWithMultiPasswords类继承了redis.StrictRedis,其中最主要的修改部分在execute_command函数中,它负责筛选出哪一个密码可以被使用。execute_command函数传入了一个_telepresent_pwd_key选项,这是用来保存用户的密码。
接下来,我们进一步地看一下execute_command函数。该函数中用了一个password_key变量来存储要尝试使用的密码,这些密码是从密码字典中读取的。使用options参数将这些密码传递给Redis 服务器 。
如果服务器响应Authentication required,则表示传递的密码不正确,程序必须遍历管理密码,直到找到正确的密码。如果再没有找到,那么我们就发生了致命错误:服务器直接说它不能识别我们。以上是我们的Redis多密码方案的主要部分。
结论
Redis是一个高效的数据库,为Redis设置多个密码可以为数据安全提供多一层有效的保障。使用Python实现的Redis多密码机制使得用户可以授予不同的操作不同的密码,从而大大增强Redis中数据的安全性。因此,使用Redis多密码方案成为了提高数据安全的必要手段之一。
香港服务器首选树叶云,2H2G首月10元开通。树叶云(www.IDC.Net)提供简单好用,价格厚道的香港/美国云服务器和独立服务器。IDC+ISP+ICP资质。ARIN和APNIC会员。成熟技术团队15年行业经验。
如何给redis设置密码
edis作为一个高速数据库,在互联网上,必须有对应的安全机制来进行保护,方法有2,如下。 1.比较安全的办法是采用绑定IP的方式来进行控制。 请在redis...不可以。 王者荣耀游戏的防沉迷系统限制的是你这一个账号,而不是你这个账号内的角色,意思就是不管你这个账号下面有多少个不同区的角色,只要所有角色一天内加起来游戏时间达到了限制,那么账号便会被限制,此时该账号内的所有角色在今天都无法参与游戏了。 若是真的还想玩的话,那么除非换一个号,否则是不可能的了。 扩展资料:《王者荣耀》的具体防沉迷措施:12周岁以下(含12周岁)的未成年人限制每天只能进行游戏1个小时,并且晚上9点之后将禁止该年龄段玩家的登陆,而至于12周岁以上的未成年人,每天的游戏限玩时间为2小时,超出该时间的玩家也将会被游戏强制下线。 该措施中的年龄均是按照游戏实名制时候登记的身份证日期
redis密码怎么设置
在 cli 中,直接 auto 就好。NS:bin ns$ ./redis-cli 127.0.0.1:6379> get ns-idalloc(error) NOAUTH Authentication required.127.0.0.1:6379> auth LahmYycOK127.0.0.1:6379> get ns-idalloc.0.0.1:6379>
如何使用redis和zookeeper实现分布式锁
1. 利用节点名称的唯一性来实现共享锁ZooKeeper抽象出来的节点结构是一个和unix文件系统类似的小型的树状的目录结构。 ZooKeeper机制规定:同一个目录下只能有一个唯一的文件名。 例如:我们在Zookeeper目录/test目录下创建,两个客户端创建一个名为Lock节点,只有一个能够成功。 算法思路: 利用名称唯一性,加锁操作时,只需要所有客户端一起创建/test/Lock节点,只有一个创建成功,成功者获得锁。 解锁时,只需删除/test/Lock节点,其余客户端再次进入竞争创建节点,直到所有客户端都获得锁。 基于以上机制,利用节点名称唯一性机制的共享锁算法流程如图所示:该共享锁实现很符合我们通常多个线程去竞争锁的概念,利用节点名称唯一性的做法简明、可靠。 由上述算法容易看出,由于客户端会同时收到/test/Lock被删除的通知,重新进入竞争创建节点,故存在惊群现象。 使用该方法进行测试锁的性能列表如下:总结 这种方案的正确性和可靠性是ZooKeeper机制保证的,实现简单。 缺点是会产生“惊群”效应,假如许多客户端在等待一把锁,当锁释放时候所有客户端都被唤醒,仅仅有一个客户端得到锁。 2. 利用临时顺序节点实现共享锁的一般做法首先介绍一下,Zookeeper中有一种节点叫做顺序节点,故名思议,假如我们在/lock/目录下创建节3个点,ZooKeeper集群会按照提起创建的顺序来创建节点,节点分别为/lock/、/lock/、/lock/。 ZooKeeper中还有一种名为临时节点的节点,临时节点由某个客户端创建,当客户端与ZooKeeper集群断开连接,则开节点自动被删除。 利用上面这两个特性,我们来看下获取实现分布式锁的基本逻辑:客户端调用create()方法创建名为“locknode/guid-lock-”的节点,需要注意的是,这里节点的创建类型需要设置为EPHEMERAL_SEQUENTIAL。 客户端调用getChildren(“locknode”)方法来获取所有已经创建的子节点,同时在这个节点上注册上子节点变更通知的Watcher。 客户端获取到所有子节点path之后,如果发现自己在步骤1中创建的节点是所有节点中序号最小的,那么就认为这个客户端获得了锁。 如果在步骤3中发现自己并非是所有子节点中最小的,说明自己还没有获取到锁,就开始等待,直到下次子节点变更通知的时候,再进行子节点的获取,判断是否获取锁。 释放锁的过程相对比较简单,就是删除自己创建的那个子节点即可。 上面这个分布式锁的实现中,大体能够满足了一般的分布式集群竞争锁的需求。 这里说的一般性场景是指集群规模不大,一般在10台机器以内。 不过,细想上面的实现逻辑,我们很容易会发现一个问题,步骤4,“即获取所有的子点,判断自己创建的节点是否已经是序号最小的节点”,这个过程,在整个分布式锁的竞争过程中,大量重复运行,并且绝大多数的运行结果都是判断出自己并非是序号最小的节点,从而继续等待下一次通知——这个显然看起来不怎么科学。 客户端无端的接受到过多的和自己不相关的事件通知,这如果在集群规模大的时候,会对Server造成很大的性能影响,并且如果一旦同一时间有多个节点的客户端断开连接,这个时候,服务器就会像其余客户端发送大量的事件通知——这就是所谓的惊群效应。 而这个问题的根源在于,没有找准客户端真正的关注点。 我们再来回顾一下上面的分布式锁竞争过程,它的核心逻辑在于:判断自己是否是所有节点中序号最小的。 于是,很容易可以联想的到的是,每个节点的创建者只需要关注比自己序号小的那个节点。 3、利用临时顺序节点实现共享锁的改进实现下面是改进后的分布式锁实现,和之前的实现方式唯一不同之处在于,这里设计成每个锁竞争者,只需要关注”locknode”节点下序号比自己小的那个节点是否存在即可。 算法思路:对于加锁操作,可以让所有客户端都去/lock目录下创建临时顺序节点,如果创建的客户端发现自身创建节点序列号是/lock/目录下最小的节点,则获得锁。 否则,监视比自己创建节点的序列号小的节点(比自己创建的节点小的最大节点),进入等待。 对于解锁操作,只需要将自身创建的节点删除即可。 具体算法流程如下图所示:使用上述算法进行测试的的结果如下表所示:该算法只监控比自身创建节点序列号小(比自己小的最大的节点)的节点,在当前获得锁的节点释放锁的时候没有“惊群”。 总结 利用临时顺序节点来实现分布式锁机制其实就是一种按照创建顺序排队的实现。 这种方案效率高,避免了“惊群”效应,多个客户端共同等待锁,当锁释放时只有一个客户端会被唤醒。 4、使用menagerie其实就是对方案3的一个封装,不用自己写代码了。 直接拿来用就可以了。 menagerie基于Zookeeper实现了包的一个分布式版本。 这个封装是更大粒度上对各种分布式一致性使用场景的抽象。 其中最基础和常用的是一个分布式锁的实现: ,通过ZooKeeper的全局有序的特性和EPHEMERAL_SEQUENTIAL类型znode的支持,实现了分布式锁。 具体做法是:不同的client上每个试图获得锁的线程,都在相同的basepath下面创建一个EPHEMERAL_SEQUENTIAL的node。 EPHEMERAL表示要创建的是临时znode,创建连接断开时会自动删除; SEQUENTIAL表示要自动在传入的path后面缀上一个自增的全局唯一后缀,作为最终的path。 因此对不同的请求ZK会生成不同的后缀,并分别返回带了各自后缀的path给各个请求。 因为ZK全局有序的特性,不管client请求怎样先后到达,在ZKServer端都会最终排好一个顺序,因此自增后缀最小的那个子节点,就对应第一个到达ZK的有效请求。 然后client读取basepath下的所有子节点和ZK返回给自己的path进行比较,当发现自己创建的sequential node的后缀序号排在第一个时,就认为自己获得了锁;否则的话,就认为自己没有获得锁。 这时肯定是有其他并发的并且是没有断开的client/线程先创建了node。
发表评论