简单介绍
包文件结构,此包是一个对数据源密码进行加密的包。
从工具类开始看
从工具类向后看
获取名为database-keyencryption-phcdb-i.properties的properties文件里的database-value-i值和database-iv-i值。
同理获取database-keyencryption-phcdb-s.properties里的database-value-s和database-iv-s
同理获取databses-keyencryption-phcdb-o.properties里的database-value-o和database-iv-o
三个value拼成一个value,三个iv拼成一个iv。
根据拼出的iv,value和传入的密文p1,通过new SM4Util().decryptBySM4CBC()方法进行运算得出明文p2。并且p2是直接return返回了。
我们进SM4Util这个类里看decryptBySM4CBC这个方法。
传参转成16进制再调方法。结果转成utf8格式。恩,string的通常的处理方式。
再深入进去。decryptData_CBC方法
恩,一些校验和实例的创建。再深入sm4_crypt_cbc方法
这是一些具体的运算方法了。回到SM4DecryptUtil类。那么这个类的decrypt的解密方法已经看完了。
从工具类向前看
getProperties
ResourceBundle类:可以读取配置文件。
使用ResourceBundle访问本地资源。可以访问一个/WEB-INF/classes目录下的一个后缀名为properties的文本类型文件,从里面读取我们需要的值。
就如同上面的,从database-keyencryption-phcdb-i.properties文件中获取键为database-value-i的值。
继续深入,点到getBundle方法里面。
我又发现一个注解。@CallerSensitive
作用:针对于方法调用者做一些控制。
1.要求调用者必须有@CallerSensitive注解,并且必须有权限(由bootstrap class loader或者extension class loader加载的类)才可以调用。
关于这贴一份官方解释:
这个注解是为了堵住漏洞用的。曾经有黑客通过构造双重反射来提升权限,
原理是当时反射只检查固定深度的调用者的类,看它有没有特权,
例如固定看两层的调用者(getCallerClass(2))。如果我的类本来没足够
权限群访问某些信息,那我就可以通过双重反射去达到目的:反射相关
的类是有很高权限的,而在 我->反射1->反射2 这样的调用链上,反射2
检查权限时看到的是反射1的类,这就被欺骗了,导致安全漏洞。
使用CallerSensitive后,getCallerClass不再用固定深度去寻找
actual caller(“我”),而是把所有跟反射相关的接口方法都标注上
CallerSensitive,搜索时凡看到该注解都直接跳过,这样就有效解决了
前面举例的问题
2.Reflection.getCallerClass()加了@CallerSensitive注解后,能够跟踪到最初的调用者。
类似抛异常的时候exception.getStackTrace()获取栈追踪信息。
3.@CallerSensitive能够堵住反射的漏洞,当你尝试用反射调用Reflection.getCallerClass(),结果会抛出异常。
意思就是不能反射调用。
再深入就是java.util包的源码了,就到此为止。