首页 文章 精选 留言 我的

精选列表

搜索[安全机制],共10000篇文章
优秀的个人博客,低调大师

[springboot]springboot对数据文件的加载机制

1 在命令行中传入的参数。 2 SPRING_APOLICATION_JSON中的属性。SPRING_APPLICATION_JSON是以JSON格式配置在系统环境变量中的内容。 3 java:comp/env中的JNDI属性。 4 java的系统属性,可以通过System.getProperties()获得的内容。 5 操作系统的环境变量。 6 通过random.*配置的随机属性。 7 位于当前应用jar包之外,针对不同{profile}环境的配置文件内容, 例如application-{profile}.properties或是YAML定义的配置文件。 8 位于当前应用jar包之内,针对不同{profile}环境的配置文件内容, 例如application-{profile}。properties或是YAML定义的配置文件。 9 位于当前应用jar包之外的application.properties和YAML配置内容。 10 位于当前应用jar包之内的application.properties和YAML配置内容。 11 在@Configuration注解修改的类中,通过@PropertySource注解定义的属性。 12 应用默认属性,使用SpringApplication.setDefaultProperties定义的内容。 优先级按上面的顺序由高到低,数字越小优先级越高 -------《Spring Cloud微服务实战》崔永超

优秀的个人博客,低调大师

Go 语言传统的同步 goroutine 的机制

在这方面,JAVA确实细致, 至于GO能否在线程池方法有JAVA的优势, 要时间证明。 package main import ( "fmt" "runtime" "sync" ) var ( counter int wg sync.WaitGroup mutex sync.Mutex ) func main() { runtime.GOMAXPROCS(1) wg.Add(2) fmt.Println("Start Goroutines") go incCounter(10) go incCounter(20) fmt.Println("Waiting to Finish") wg.Wait() fmt.Println("\nFinal Counter: ", counter) } func incCounter(id int) { defer wg.Done() for count := 0; count < id; count++ { mutex.Lock() { value := counter runtime.Gosched() value++ counter = value } mutex.Unlock() } }

优秀的个人博客,低调大师

深入理解Linux用户空间的锁机制

1.缘起 随着SMP(Symmetrical Multi-Processing)架构的流行和epoll类系统调用对非阻塞fd监视的支持,高性能服务器端的开发已经能够实现CPU计算和IO的分离。为了充分发挥CPU的计算能力,服务器端的设计必须要尽量减少线程切换。引起线程切换最重要的原因之一就是对mutex和semaphor等锁的使用。本文从计算机体系架构、操作系统的支持和mutex的实现彻底分析Linux用户空间mutex的实现,分析的源码版本是glib-2.3.4和kernel-2.6.8。 2. 体系结构和指令的支持 在UP(uni processor)架构下,从用户空间的角度看,中断打断了程序的正常执行。操作系统在处理完中断之后,返回用户空间的之前,重新调度系统中的线程执行。由于CPU是在执行汇编指令结束后响应中断,那么单条汇编指令的执行就是原子的。 在SMP下,由于存在CPU Local Cache和每个CPU的指令周期不同,单条汇编指令的执行不会是原子的。X86 SMP提供了一个lock指令前缀,使得某些汇编指令的执行是原子的。看如下x86_64体系结构的汇编代码,来自glibc。 Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2中对cmpxchg指令的解释如下: This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically. 所有以lock为前缀的指令都起内存栅栏的作用。内存栅栏使编译器确保对RAM中数据的改变对所有CPU都是可见的。 上述汇编对应的伪代码: Intel® 64 and IA-32 Architectures Software Developer’s Manual Volume 2中对cmpxchg指令的解释如下: This instruction can be used with a LOCK prefix to allow the instruction to be executed atomically. by gaolingfei 所有以lock为前缀的指令都起内存栅栏的作用。内存栅栏使编译器确保对RAM中数据的改变对所有CPU都是可见的。 上述汇编对应的伪代码: 3. 操作系统支持 按照操作系统的经典定义,进程是资源分配的最小单位,线程是调度的最小单位。 Linux操作系统提供了 futex系统调用以支持 mutex等锁的实现。 futex的主要功能是使得线程以 TASK_INTERRUPTIBLE状态等待处于进程空间的某变量的改变,或者使得某线程可以唤醒等待该变量的其他线程。 2.6.8版的 Kernel中, futex的实现使用一个 futex_hash_bucket。操作系统用户空间任何线程如果在等待mutex或者semaphore的up操作,都是以每个锁的address等为key,将自身线程挂到该futex_hash_bucket等待被唤醒。 实现 wait的步骤如下: A. down_read得到当前线程整个地址空间的读锁,从该步起到 up_read,与线程同一个进程的其他线程mmap()和brk()系统调用都会挂起,mmap()和brk()是malloc()和free()的基础。()(& current->mm->mmap_sem); B.调用 find_extend_vma以确认用户空间锁的地址是否是shared or private mapping. shared mapping一般是进程有多个线程引起的。 find_extend_vma会搜索整个进程地址空间段组成红黑树,以确定该地址空间的类型。()(), C.计算 key。如果是单进程单线程, Key为用户空间地址。如果为单进程多线程,需要执行 spin_lock得到用户地址对应的page,然后 spin_unlock。page_table_lock会影响相应进程的page fault的处理。(& current->mm->page_table_lock)(& current->mm->page_table_lock); D.将自身线程加入到 futex_hash_bucket, futex_hash_bucket的每个桶有一个spin lock保护。 E. up_read(& current->mm->mmap_sem); F. __set_current_state( TASK_INTERRUPTIBLE); G. __set_current_state此时线程已经被其他线程唤醒。( TASK_RUNNING); H.将自身从 futex_hash_bucket移除。 实现 wake up的步骤如下: A.执行 wait的 A到 C。 B. spin_lock给相应桶加锁。(&bh-> lock); C.唤醒在锁上的一个等待线程。 D. spin_unlock(&bh-> lock); E. up_read(& current->mm->mmap_sem); 4. pthread_mutex 实现分析 pthread_mutex_lock()实现在 glibc-2.3.4 pthread_mutex_lock.c文件的 33行,该函数会根据 mutex在 init的时候设置的属性,选择不同的执行路径。 mutex的属性有四种: A. PTHREAD_MUTEX_TIMED_NP:默认属性。 pthread_mutex_lock()直接调用 lll_mutex_lock()。 B. PTHREAD_MUTEX_RECURSIVE_NP:检查 mutex owner是否为当前线程。该属性允许线程多次获取该锁。 C. PTHREAD_MUTEX_ERRORCHECK_NP:如果同一线程两次 lock,会返回错误。 D. PTHREAD_MUTEX_ADAPTIVE_NP:该锁会先 n次调用 lll_mutex_trylock(), n为用户定义和 100的最小值。如果仍然失败,则调用 lll_mutex_lock()。 lll_mutex_trylock()不会调用 futex。 5. spin lock 实现 nginx实现了 spin lock以保护多进程对 listen port的互斥 accept。 spinlock的实现如下: Spinlock本质上是一个“忙等”锁,由于其不存在下节中总结的 mutex的缺点,其对于小资源是最高效的锁。相比上节中 mutex的 PTHREAD_MUTEX_ADAPTIVE_NP属性, nginx的 spinlock是一个更完美的实现方案。 6. 总结 在设置 PTHREAD_MUTEX_TIMED_NP属性和单进程多线程模型下, pthread_mutex_lock()对同进程的其他线程的影响如下: A. pthread_mutex_lock()占用的大部分 CPU时间当中,直接影响其他线程调用 mmap(), brk(), malloc和 free()。 B.对进程处理 page fault也会有影响。 C.如果整个操作系统的用户进程使用了过多的 mutex之类的锁,那么所有锁共享的 futex_hash_bucket将是一个瓶颈。 D.最重要的是,锁的使用会引起线程的频繁切换,导致 cpu cache miss和 TLB miss。 对于系统中,需要互斥访问的资源,如下建议: A.内核中对于小资源如链表的增删,多是使用 spin lock保护。 B.在设置 PTHREAD_MUTEX_ADAPTIVE_NP属性下, mutex既可以是 spin lock,也可以是阻塞锁。 C.使用 atomic_add_return(i, v),原子对变量 i增加 v值,并且返回操作后的值。相反操作: atomic_sub_return(i, v)。 D.使用 Per-CPU variables,例如多线程程序中要每隔 1秒,统计某项操作的值。该变量最好是 cache alignment。 E.对于如数据库频繁更新的操作,可以使用数据库的多版本并发控制方法减少对 mutex的 lock。 本文转自百度技术51CTO博客,原文链接:http://blog.51cto.com/baidutech/1033629 ,如需转载请自行联系原作者

优秀的个人博客,低调大师

harbor的加密机制与后台修改登录密码

参考:https://github.com/mitsuhiko/python-pbkdf2/blob/master/pbkdf2.py 很久没写博客,也是没时间写,因为平时工作忙,也没什么时间写博客,今天刚好抽点空,哈哈。 我们公司由于要做应用docker化,所以免不了要用harbor来存储docker镜像,比较方便。然而我们设想一下,如果哪天你的web登录密码忘了,而管理员的web登录密码也忘了,那该如何修改密码呢? 毫无疑问我们只能进harbor的后台mysql进行修改,但是查资料发现,这个harbor中的mysql的密码是采用pbkdf2算法,调用的Hash函数为Sha1,迭代4096次,密钥长度为int型16位得出的,所以你常规的用明文密码去update是不行的,必须要通过算法将密钥算出来,然后update可以成功。 下面是密钥计算算法,计算明文为123QWEqwe, 盐值为gktqer4zml32472wmht9xeuixvg5pvjd, 迭代次数为4096, 密钥长度int型16位 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 import hmac import hashlib from struct import Struct from operator import xor from itertools import izip,starmap _pack_int = Struct( '>I' ).pack def pbkdf2_hex(data,salt,iterations = 4096 ,keylen = 16 ,hashfunc = None ): return pbkdf2_bin(data,salt,iterations,keylen,hashfunc).encode( 'hex' ) def pbkdf2_bin(data,salt,iterations = 4096 ,keylen = 16 ,hashfunc = None ): hashfunc = hashfunc or hashlib.sha1 mac = hmac.new(data, None ,hashfunc) def _pseudorandom(x,mac = mac): h = mac.copy() h.update(x) return map ( ord ,h.digest()) buf = [] for block in xrange ( 1 , - ( - keylen / / mac.digest_size) + 1 ): rv = u = _pseudorandom(salt + _pack_int(block)) for i in xrange (iterations - 1 ): u = _pseudorandom(''.join( map ( chr ,u))) rv = starmap(xor,izip(rv,u)) buf.extend(rv) return ''.join( map ( chr ,buf))[:keylen] rv = pbkdf2_hex( '123QWEqwe' , 'gktqer4zml32472wmht9xeuixvg5pvjd' , 4096 , 16 ) print (rv) 计算出密钥值为65e900b5a2bdff474e29d0d2b21f4945 下面更新下数据库,修改用户名为testc的密码:update user set password='65e900b5a2bdff474e29d0d2b21f4945' where name='testc'; 前台web登录账号:testc 前台web登录密码:123QWEqwe 再带上一个随机出salt值的代码: #32位随机密码 from random import choice import string def Makepass(length=32, chars=string.letters+string.digits): return ''.join([choice(chars) for i in range(length)]) if __name__ == '__main__': for i in range(10): print Makepass() 本文转自飞奔的小GUI博客51CTO博客,原文链接http://blog.51cto.com/9237101/2057032如需转载请自行联系原作者 ziwenzhou

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册