代码混淆

代码混淆
代码混淆

混淆文件 proguard-rules.pro 参数详解:

[plain]view plain copy

print?

1.-optimizationpasses 5 # 指定代码

的压缩级别

2.-dontusemixedcaseclassnames # 是否使用

大小写混合

3.-dontskipnonpubliclibraryclasses # 是否混淆

第三方jar

4.-dontpreverify # 混淆时是

否做预校验

5.-verbose # 混淆时是

否记录日志

6.-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所

采用的算法

7.

8.-keep public class * extends android.app.Activity # 保持哪些

类不被混淆

9.-keep public class * extends android.app.Application # 保持哪些

类不被混淆

10.-keep public class * extends android.app.Service # 保持哪些

类不被混淆

11.-keep public class * extends android.content.BroadcastReceiver # 保持哪些

类不被混淆

12.-keep public class * extends android.content.ContentProvider # 保持哪些

类不被混淆

13.-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些

类不被混淆

14.-keep public class * extends android.preference.Preference # 保持哪些

类不被混淆

15.-keep public class com.android.vending.licensing.ILicensingService # 保持哪些

类不被混淆

16.

17.-keepclasseswithmembernames class * { # 保

持 native 方法不被混淆

18. native ;

19.}

20.

21.-keepclasseswithmembers class * { # 保持自定

义控件类不被混淆

22. public (android.content.Context, android.util.AttributeSet);

23.}

24.

25.-keepclasseswithmembers class * {

26. public (android.content.Context, android.util.AttributeSet, int); # 保持自定

义控件类不被混淆

27.}

28.

29.-keepclassmembers class * extends android.app.Activity { # 保持自定

义控件类不被混淆

30. public void *(android.view.View);

31.}

32.

33.-keepclassmembers enum * { # 保持枚

举 enum 类不被混淆

34. public static **[] values();

35. public static ** valueOf(https://www.360docs.net/doc/276890993.html,ng.String);

36.}

37.

38.-keep class * implements android.os.Parcelable { # 保

持 Parcelable 不被混淆

39. public static final android.os.Parcelable$Creator *;

40.}

41.

42.-keep class MyClass; # 保持自己

定义的类不被混淆

以上是最基础的配置,几乎每个项目都需要进行这些地方的混淆(或保持不混淆)。

如果你仔细看过上方的注释,就会了解一些基本代码混淆策略了。

只是,这还远远不够,因为你在项目中,总会不可避免的引用第三方的library库或是jar包,那,如果你不能够正确的混淆第三方的资源,可能会导致你的应用无法使用。(我就因为忘了配置Gson相关的混淆,导致页面一直没有数据显示,蛋疼的一笔)。

贴出我项目中关于第三方的混淆部分:

[plain]view plain copy

print?

1.#如果有引用v4包可以添加下面这行

2.-keep class android.support.v4.** { *; }

3.-keep public class * extends android.support.v

4.**

4.-keep public class * extends android.app.Fragment

5.

6.

7.#如果引用了v4或者v7包,可以忽略警告,因为用不到android.support

8.-dontwarn android.support.**

9.

10.

11.

12.#保持自定义组件不被混淆

13.-keep public class * extends android.view.View {

14. public (android.content.Context);

15. public (android.content.Context, android.util.AttributeSet);

16. public (android.content.Context, android.util.AttributeSet, int);

17. public void set*(...);

18.}

19.

20.

21.#保持 Serializable 不被混淆

22.-keepnames class * implements java.io.Serializable

23.

24.#保持 Serializable 不被混淆并且enum 类也不被混淆

25.-keepclassmembers class * implements java.io.Serializable {

26. static final long serialVersionUID;

27. private static final java.io.ObjectStreamField[] serialPersistentFields;

28. private void writeObject(java.io.ObjectOutputStream);

29. private void readObject(java.io.ObjectInputStream);

30. https://www.360docs.net/doc/276890993.html,ng.Object writeReplace();

31. https://www.360docs.net/doc/276890993.html,ng.Object readResolve();

32.}

33.

34.#保持枚举 enum 类不被混淆如果混淆报错,建议直接使用上面

的 -keepclassmembers class * implements java.io.Serializable即可

35.-keepclassmembers enum * {

36. public static **[] values();

37. public static ** valueOf(https://www.360docs.net/doc/276890993.html,ng.String);

38.}

39.

40.-keepclassmembers class * {

41. public void *ButtonClicked(android.view.View);

42.}

43.

44.#不混淆资源类

45.#-keepclassmembers class **.R$* {

46.# public static ;

47.#}

48.

49.

50.#xUtils(保持注解,及使用注解的Activity不被混淆,不然会影响Activity中你使用注解相关的代码无法使

用)

51.-keep class * extends https://www.360docs.net/doc/276890993.html,ng.annotation.Annotation {*;}

52.-keep class com.otb.designerassist.activity.** {*;}

53.

54.

55.#自己项目特殊处理代码(这些地方我使用了Gson类库和注解,所以不希望被混淆,以免影响程序)

56.-keep class com.otb.designerassist.entity.** {*;}

57.-keep class com.otb.designerassist.http.rspdata.** {*;}

58.-keep class com.otb.designerassist.service.** {*;}

59.

60.

61.##混淆保护自己项目的部分代码以及引用的第三方jar包library(想混淆去掉"#")

62.#-libraryjars libs/umeng-analytics-v5.2.4.jar

63.#-libraryjars libs/alipaysecsdk.jar

64.#-libraryjars libs/alipayutdid.jar

65.#-libraryjars libs/weibosdkcore.jar

66.

67.

68.# 以libaray的形式引用的图片加载框架,不想混淆(注意,此处不是jar包形式,想混淆去掉"#")

69.#-keep class com.nostra13.universalimageloader.** { *; }

70.

71.

72.###-------- Gson 相关的混淆配置--------

73.-keepattributes Signature

74.-keepattributes *Annotation*

75.-keep class sun.misc.Unsafe { *; }

76.

77.

78.

79.

80.###-------- pulltorefresh 相关的混淆配置---------

81.-dontwarn com.handmark.pulltorefresh.library.**

82.-keep class com.handmark.pulltorefresh.library.** { *;}

83.-dontwarn com.handmark.pulltorefresh.library.extras.**

84.-keep class com.handmark.pulltorefresh.library.extras.** { *;}

85.-dontwarn com.handmark.pulltorefresh.library.internal.**

86.-keep class com.handmark.pulltorefresh.library.internal.** { *;}

87.

88.

89.###--------- reservoir 相关的混淆配置-------

90.-keep class com.anupcowkur.reservoir.** { *;}

91.

92.

93.###-------- ShareSDK 相关的混淆配置---------

94.-keep class cn.sharesdk.** { *; }

95.-keep class com.sina.sso.** { *; }

96.

97.

98.###--------------umeng 相关的混淆配置-----------

99.-keep class com.umeng.** { *; }

100.-keep class com.umeng.analytics.** { *; }

101.-keep class https://www.360docs.net/doc/276890993.html,mon.** { *; }

102.-keep class com.umeng.newxp.** { *; }

103.

104.

105.###-----------MPAndroidChart图库相关的混淆配置------------

106.-keep class com.github.mikephil.charting.** { *; }

以上的配置,即是对一个项目的混淆配置了,相对比较完整,大家可以依葫芦画瓢,写更多的配置,对于一些第三方项目的使用,一般官方会给出如何配置混淆,大家需要小心,别忘了配置。

好啦,如果你已经写好自己的混淆配置文件,不要忘了在build.gradle文件中再次配置下,打开混淆文件:

[plain]view plain copy

print?

1.buildTypes {

2. debug {

3. // 显示Log

4. buildConfigField "boolean", "LOG_DEBUG", "true"

5.

6.

7. versionNameSuffix "-debug"

8. minifyEnabled false

9. zipAlignEnabled false

10. shrinkResources false

11. signingConfig signingConfigs.assist

12. }

13.

14.

15. release {

16. // 不显示Log

17. buildConfigField "boolean", "LOG_DEBUG", "false"

18.

19. //混淆

20. minifyEnabled true

21.

22. //Zipalign优化

23. zipAlignEnabled true

24.

25.

26. // 移除无用的resource文件

27. shrinkResources true

28. //加载默认混淆配置文件

29. proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.p

ro'

30. //签名

31. signingConfig signingConfigs.assist

32.

33. }

34. }

release节点下,minifyEnabled设置为true。

二进制代码混淆的国内外研究现状

二进制代码混淆的国内外研究现状 1.国内外研究现状 南开大学 贾春福 《路径模糊一种有效抵抗符号执行的二进制混淆技术》提出了一种新的基于路径模糊的软件保护方法以抵抗符号执行的逆向分析:利用条件异常代码替换条件跳转指令来隐藏程序的路径分支信息,通过系统的异常处理机制实现程序的跳转,并使用不透明谓词技术引入伪造的路径分支来弥补程序在统计属性上的差异。 电子科技大学 吴适 《基于二进制代码混淆的软件保护研究》提出一种新的 C2D 转换的混淆算法—基于代码-数据欺骗的混淆算法,该算法的目的是为了在静态分析工具中隐藏目标基本块及到目标基本块的控制流,当反汇编器遇上条件跳转指令时,跳转指令中的目标地址和跳转指令紧接着的地址都会被解释成指令。 令绝对跳转指令(jmp,ret)后面的地址为 A,当使用递归遍历算法时,若没有其他指令跳转到 A,则 A 不会被解释成指令;当使用顺序扫描算法时,A 地址处存在无法被解释的指令,则会跳过对 A 的反汇编。利用这两点规律,将真正的控制转移隐藏在某条指令的数据部分中,还可以将指令隐藏在代码段的静态数据中。 西北大学王怀军《基于变形的二进制代码混淆技术研究》研究并实现了二进制代码混淆保护原型系统MEPE,MEPE 系统变形部分主要包含3 方面研究内容: 1) 指令等价变形,主要通过设计指令变形的模板函数,利用模板函数对原始指令进行等价变形。2) 控制流混淆,通过打乱原来指令的物理顺序,利用跳转地址表管理指令执行顺序; 3) 循环体中指令变形的控制,首先分析循环结构对时间开销的影响,然后提出控制循环体中指令变形和控制流混淆的方法。 南开大学 王志 《二进制代码路径混淆技术研究》提出了一种全新的线性代码混淆策略,该策略将未解数学猜想引入到软件的路径信息中,将基于符号执行和约束求解技术的逆向工程难度等价到证明未解数学猜想的难度。在代码混淆中只使用线性操作,不使用加密函数。多项式等价变换、收敛值变换、固定循环次数变换和相似控制流变换是基于未解数学猜想的路径混淆所特有的变换方式,多态和变形技术是常用的代码变换技术,由于基于未解数学猜想的路径混淆有很好的可扩展性,

代码混淆

混淆文件 proguard-rules.pro 参数详解: [plain]view plain copy print? 1.-optimizationpasses 5 # 指定代码 的压缩级别 2.-dontusemixedcaseclassnames # 是否使用 大小写混合 3.-dontskipnonpubliclibraryclasses # 是否混淆 第三方jar 4.-dontpreverify # 混淆时是 否做预校验 5.-verbose # 混淆时是 否记录日志 6.-optimizations !code/simplification/arithmetic,!field/*,!class/merging/* # 混淆时所 采用的算法 7. 8.-keep public class * extends android.app.Activity # 保持哪些 类不被混淆 9.-keep public class * extends android.app.Application # 保持哪些 类不被混淆 10.-keep public class * extends android.app.Service # 保持哪些 类不被混淆 11.-keep public class * extends android.content.BroadcastReceiver # 保持哪些 类不被混淆 12.-keep public class * extends android.content.ContentProvider # 保持哪些 类不被混淆 13.-keep public class * extends android.app.backup.BackupAgentHelper # 保持哪些 类不被混淆 14.-keep public class * extends android.preference.Preference # 保持哪些 类不被混淆 15.-keep public class com.android.vending.licensing.ILicensingService # 保持哪些 类不被混淆 16. 17.-keepclasseswithmembernames class * { # 保 持 native 方法不被混淆 18. native ; 19.} 20. 21.-keepclasseswithmembers class * { # 保持自定 义控件类不被混淆 22. public (android.content.Context, android.util.AttributeSet); 23.} 24. 25.-keepclasseswithmembers class * { 26. public (android.content.Context, android.util.AttributeSet, int); # 保持自定 义控件类不被混淆 27.} 28. 29.-keepclassmembers class * extends android.app.Activity { # 保持自定 义控件类不被混淆 30. public void *(android.view.View); 31.} 32. 33.-keepclassmembers enum * { # 保持枚 举 enum 类不被混淆 34. public static **[] values(); 35. public static ** valueOf(https://www.360docs.net/doc/276890993.html,ng.String); 36.} 37. 38.-keep class * implements android.os.Parcelable { # 保 持 Parcelable 不被混淆 39. public static final android.os.Parcelable$Creator *; 40.} 41. 42.-keep class MyClass; # 保持自己 定义的类不被混淆 以上是最基础的配置,几乎每个项目都需要进行这些地方的混淆(或保持不混淆)。 如果你仔细看过上方的注释,就会了解一些基本代码混淆策略了。 只是,这还远远不够,因为你在项目中,总会不可避免的引用第三方的library库或是jar包,那,如果你不能够正确的混淆第三方的资源,可能会导致你的应用无法使用。(我就因为忘了配置Gson相关的混淆,导致页面一直没有数据显示,蛋疼的一笔)。 贴出我项目中关于第三方的混淆部分: [plain]view plain copy print?

代码混淆pro文件配置修改

编辑pro文件,找到以下代码 -dontskipnonpubliclibraryclassmembers -target 1.5 -dontshrink -dontoptimize -useuniqueclassmembernames -keeppackagenames -keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,LocalVariable*Table ,*Annotation*,Synthetic,EnclosingMethod -keepparameternames -dontwarn -ignorewarnings 在代码后添加相关配置 #不混淆lib下jar包里面的class文件 -keep class WebRoot.WEB-INFO.lib.* #不混淆action包里面的类名,字段名,方法名 #在界面上会用到这些字段和getset方法 -keepnames class **.kf.**.action.**{ public private protected ; public ; } -keepnames class **.kf.**.dao.**{ } -keepnames class **.kf.**.service.**{ } -keep class * extends org.springframework.orm.hibernate3.support.HibernateDaoSupport { public ; } #不混淆实体的字段和方法,jsp的表单里面会有这些属性的值,混淆之后,会出现无法提交表单情况 -keep class **.entity.** { public private protected ; public ; }

Java开发规范

Java开发规范

目录 第1章序言 (4) 第2章java一般性研发规范 (5) 2.1 代码格式 (5) 2.1.1包、类、方法的命名规范: (5) 2.1.2方法的命名应注意避免与java中具有特殊意义的名称例如equals, hashCode,clone,finalizer等冲突 (7) 2.1.3Java bean中取得boolean类型的属性值必须使用is****形式命名 (9) 2.1.4if,else,while,for等必须使用{} (9) 2.1.5类必须包含在包里,禁止出现无包的类 (10) 2.1.6类和方法必须拥有注释,注释量占总体代码25%以上,类头部,以及方法 头部的注释应符合javadoc标准。 (11) 2.2 基本语法 (12) 2.2.1不能随意捕捉异常,原则上谁捕捉谁处理 (12) 2.2.2if,while,try,finally,switch ,synchronized ,static instantiation 里面应有相应的逻辑处理,不能为空。 (13) 2.2.3在处理循环中,不能在程序中人为的改变步长。 (14) 2.2.4将简单类型int,short,float,double等转化成字符串时,需使用其对 应类的toString方法。 (14) 2.2.5javaBean中hashCode,以及equals方法必须同时override。 (15) 2.2.6懒式方式创建对象:不能采用双检查惯用法 (18) 2.2.7不能在finally中返回值。 (19) 2.2.8Boolean实例化时,应用使用Boolean.valueOf,Boolean.TRUE, Boolean.FALSE。 (19) 2.2.9Integer,Byte,Short,Long等实例化时,应用使用valueOf (20) 2.2.10对于多个if语句嵌套的情况下能够整合尽量整合。 (20) 2.2.11override function,不能只有super.function语句,否则视为无效代码 21 2.2.12Collection.toArray的注意事项。 (21) 2.2.13对于BigDecimal方法,应避免使用float值,double值进行创建,应使 用字符串形式创建。 (22) 2.2.14String,BigDecimal,BigInteger等值类型调用replace,add等方法的注 意事项。 (23) 2.2.15需要注意的引起NullException的语句。 (23) 2.2.16ResultSet使用next时,需要判断是否具有记录再进行一下步操作。 25 2.2.17字符串使用相应的规则。 (25) 2.2.18禁止直接调用 System.gc(),System.getRuntime().gc(),System.runFinalization()。 (27) 2.2.19finalize相应的规则。 (27) 2.2.20禁止在代码中使用System.out,ex.printStackTrace打印日志。 (28) 2.2.21系统资源释放(谁创建的,谁关闭) (29) 2.2.22使用Clone时相应的规则。 (32) 2.2.23java Bean类必须实现Serialize接口。 (33)

浅谈安卓开发代码混淆技术

浅谈安卓开发代码混淆技术 关键字:代码混淆,代码保护,应用安全,应用加固,安卓安全 随着移动互联网的快速发展,应用的安全问题不断涌现出来,于是越来越多的应用开发者将核心代码由java层转到native层,以对抗成熟的java逆向分析工具,然而如果native层的代码如果没有进行任何保护,还是比较容易被逆向分析工作者获取其运行逻辑,进而完成应用破解或者进行其他的操作。那么提高native代码的安全性有什么好办法吗?答案是肯定的,今天我们就来介绍一种有效对抗native层代码分析的方法——代码混淆技术。 那么,什么是代码混淆呢?代码混淆的学术定义如下: 代码混淆(code obfuscation)是指将计算机程序的代码,转换成一种功能上等价,所谓功能上的等价是指其在变换前后功能相同或相近。其解释如下:程序P经过混淆变换为P‘,若P没有结束或错误结束,那么P’也不能结束或错误结束;而且P‘程序的结果应与程序P具有相同的输出。否则P’不是P的有效的混淆。 目前对于混淆的分类,普遍是以Collberg 的理论为基础,分为布局混淆(layout obfuscation)、数据混淆(data obfuscation)、控制混淆(control obfuscation)和预防混淆(preventive obfuscation)这四种类型。 1. 布局混淆 布局混淆是指删除或者混淆软件源代码或者中间代码中与执行无关的辅助文本信息,增加攻击者阅读和理解代码的难度。软件源代码中的注释文本、调试信息可以直接删除,用不到的方法和类等代码或数据结构也可以删除,这样

即可以使攻击者难以理解代码的语义,也可以减小软件体积,提高软件装载和执行的效率。软件代码中的常量名、变量名、类名和方法名等标识符的命名规则和字面意义有利于攻击者对代码的理解,布局混淆通过混淆这些标识符增加攻击者对软件代码理解的难度。标识符混淆的方法有多种,例如哈希函数命名、标识符交换和重载归纳等。哈希函数命名是简单地将原来标识符的字符串替换成该字符串的哈希值,这样标识符的字符串就与软件代码不相关了;标识符交换是指先收集软件代码中所有的标识符字符串,然后再随机地分配给不同的标识符,该方法不易被攻击者察觉;重载归纳是指利用高级编程语言命名规则中的一些特点,例如在不同的命名空间中变量名可以相同,使软件中不同的标识符尽量使用相同的字符串,增加攻击者对软件源代码的理解难度。布局混淆是最简单的混淆方法,它不改变软件的代码和执行过程。 2. 数据混淆 数据混淆是修改程序中的数据域,而对代码段不作处理。常用的数据混淆方式有合并变量、分割变量、数组重组、字符串加密等。 合并变量是将几个变量合并为一个数据,原来的每个变量占据其中一个区域,类似于一个大的数据结构。分割变量则是将一个变量分割为两个变量,对分割前后提供一种映射关系,将对一个变量的操作转化为对分割后两个变量的操作。 数组重组有数组的分割、合并、折叠和平滑等几种方式。分割是将一个数组分成2个或多个相同维度的数组;合并则相反;折叠是增加数组的维数;平滑则是相反。 在ELF文件中,全局变量和常量字符串存放在数据段中,反汇编工具可以轻易查找到字符串与代码之间的引用关系。在软件破解中,通过一些字符串提示可

华为Java语言编码规范标准

Java语言编码规范 Prepared by 拟制Date 日期 yyyy-mm-dd Reviewed by 评审人Date 日期 yyyy-mm-dd Approved by 批准Date 日期 yyyy-mm-dd

Revision Record 修订记录

Table of Contents 目录 1. 范围 (4) 2. 规范性引用文件 (4) 3. 术语和定义 (4) 4. 排版规范 (5) 4.1. 规则 (5) 4.2. 建议 (7) 5. 注释规范 (9) 5.1. 规则 (9) 5.2. 建议 (15) 6. 命名规范 (17) 6.1. 规则 (17) 6.2. 建议 (18) 7. 编码规范 (20) 7.1. 规则 (20) 7.2. 建议 (24) 8. JTEST规范 (26) 8.1. 规则 (26) 8.2. 建议 (27)

1.范围 本规范规定了使用Java语言编程时排版、注释、命名、编码和JTEST的规则和建议。 本规范适用于使用Java语言编程的产品和项目。 2.规范性引用文件 下列文件中的条款通过本规范的引用而成为本规范的条款。凡是注日期的引用文件,其随后所有的修改单(不包括勘误的内容)或修订版均不适用于本规范,然而,鼓励根据本规范达成协议的各方研究是否可使用这些文件的最新版本。凡是不注日期的引用文件,其最新版本适用于本规范。 3.术语和定义 规则:编程时强制必须遵守的原则。 建议:编程时必须加以考虑的原则。 格式:对此规范格式的说明。 说明:对此规范或建议进行必要的解释。 示例:对此规范或建议从正、反两个方面给出例子。

安卓加固APK防破解常用技术

引言 防破解技术汇集 关键逻辑放服务端 用 native code 替代 Java 代码 代码混淆 Java 代码混淆 native code混淆 运行前做完整性校验,防止重打包 zip 加密位法 dex 加密隐藏 dex 嵌入异常汇编法 资源混淆法 禁止调试与模拟器检测 附录资料 安卓破解常用工具软件 加固 apk 实例 引言 安卓应用防止破解和重打包可以选择梆梆加固、阿里聚安全、爱加密等成熟解决方案,他们的加固比较彻底,使用的技术也比较深层次,所以破解难度也很大,但是有可能带来应用不稳定的问题,所以周期长。 如果不选择梆梆加固等的成熟方案,那么可以选择将一些防破解和重打包的对抗技术组合使用,虽然不如成熟方案层次深,但是使用简单,周期短,防住普通破解者也有不错的效果。 这里将一些这样的防破解技术整理如下,仅供参考。 每个技术都标注了易用性和防破解效果,易用性越高表明越容易实现,防破解效果越高表明攻击者越难破解。其中易用性越高表明越容易开发实现,防破解能力越高表明攻击者越难破解。 防破解技术汇集

关键逻辑放服务端 尽可能将关键的逻辑代码放在服务端运行,减少敏感代码暴露在客户端。让客户端只做一些 API 请求和界面交互。 易用性:高 防破解能力:中 用 native code 替代 Java 代码 将一部分关键的或者计算密集型的代码用 native code (Android NDK)来编写,不仅能提高运行效率,也能增加攻击者的逆向难度。 易用性:中 防破解能力:高 代码混淆 Java 代码混淆 安卓标配了 proguard,推荐使用。 易用性:高 防破解能力:中 native code混淆 对 native code 做混淆,开源工具有:obfuscator-llvm/obfuscator/wiki 根据经验,这会让破解难度大大增加。 易用性:中 防破解能力:高 运行前做完整性校验,防止重打包

实验 四:Oracle 11g数据库加密及代码混淆

实验四:Oracle 11g数据库加密及代码混淆 实验学时:2 实验类型:综合 实验要求:必修 一、实验目的 该实验主要是使学生学会在数据库中如何进行加密、解密以及计算hash、MAC。通过该实验的学习,是学生深入了解数据库中数据加密的目的、准则;掌握数据库加密、解密算法以及密钥的产生和存储,hash算法以及MAC。 二、实验内容 Oracle 11g数据库加、解密,hash以及MAC值计算;oracle 中的代码混淆 三、实验原理、方法和手段 1.数据库加密、解密(保证机密性)。 利用oracle 11g 中PL/SQL 包DBMS_CRYPTO 进行数据的加、解密。 利用这两个函数dbms_crypto.Encrypt和dbms_crypto.Decrypt ●Data Encryption Standard (DES), Triple DES (3DES, 2-key) ●Advanced Encryption Standard (AES)(128、192、256) 2.hash 和MAC 值的计算(保证完整性) 利用oracle 11g 中PL/SQL 包DBMS_CRYPTO 进行。 采用DBMS_CRYPTO.Hash和 DBMS_CRYPTO.Mac进行。 ●SHA-1 Cryptographic Hash ●SHA-1 Message Authentication Code (MAC)(Usage of SHA-1 is more secure than MD5)

3.oracle中代码混淆 参见oracle官方文档《PL/SQL User's Guide and Reference》,利用wrap utility对代码进行混淆。 四、实验组织运行要求 根据本实验的特点,采用以学生自主训练为主的开放模式组织教学。 五、实验条件 硬件:CPU:2.4G 内存:1G 硬盘:80G 软件:Windows 2003、WinXP、Win7 及以上操作系统 ,Oracle 11g数据库 六、实验步骤 1.请写一段PL/SQL代码实现在oracle中加密自己的学号,并将密文输出。请使用DBMS_CRYPTO 中:ENCRYPT_AES192、CHAIN_ECB 和PAD_PKCS5,并使用RANDOMBYTES函数产生密钥。

JAVA源代码规范

JAVA代码规范 (初稿) 2004、4 ?版本更新信息 本版本创建/修改、维护、批准涉及人员如下: 创建/修改者:XX 维护者:XX 批准者:XX 具体版本更新记录如表1-1: 表1-1 版本更新记录 修改方式:A-增加 M-修改 D-删除?目得 本文提供一整套编写高效可靠得 Java 代码得标准、约定与指南。它们以安全可靠得软件工程原则为基础,使代码易于理解、维护与增强灵活性。通过遵循一套通用得程序设计标准,显著提高 Java 软件开发者得生产效率,为开发团队得程序设计带来更大得一致性,使软件开发团队得效率明显提高。 ?规范得执行 本文档适用于公司内进行软件开发得所有技术人员,即公司内软件开发人员编写得所有源代码都必须遵循本规范。 除临时性项目之外得任何项目均应严格按照此标准执行,“临时性项目”指:?为市场推广目得而编写得示程序 ?为一次性用途而编写得临时性小程序 为学习目得而编写得测试程序 ?文档类别

本文档属标准规范类得项目限制级文档,未经总经理及总经理授权人员批准,不得提供公司以外得人员阅读与使用。 ?版本更新条件 本文档得定期评审时间为每年得1月,评审及修订步骤依据SEPG工作规范规定。此外,如遇下列条件可进行评审,并根据评审结果决定就是否需要进行修订: ?本文档所列得引用得标准已经更新。 ?本文档得使用者若对本文档有任何评论、建议或意见,请通过企业内部网络发电子邮件给SEPG,所收到得电子邮件将会在评审与修订时给予充分 得考虑。 ?使用对象 本文档得使用对象包括: ?项目管理者 ?质量保证人员 ?软件开发人员 目录 1介绍 (4) 1、1为什么要有编码规范 (4) 2通用代码格式 (4) 2、1文件组织 (4) 2、2缩进 (5) 2、3行长度 (6) 2、4换行 (6) 2、5空行 (7) 2、6空格 (7) 2、7注释 (8) 2、7、1注释约定 (8) 2、7、2实现注释得格式 (9) 2、7、3文档注释 (10) 2、7、4快速浏览javadoc (10) 2、8声明 (11) 2、8、1每行声明变量得数量 (11) 2、8、2初始化 (11) 2、8、3布局 (11) 2、8、4类与接口得声明 (12) 2、9语句 (12) 2、9、1简单语句 (12) 2、9、2复合语句 (13) 2、9、3返回语句 (13) 2、9、4if,if-else,if else-if else语句 (13)

安卓加固APK防破解常用技术

APK防破解常用技术汇总 引言 防破解技术汇集 关键逻辑放服务端 用 native code 替代 Java 代码 代码混淆 Java 代码混淆 native code混淆 运行前做完整性校验,防止重打包 zip 加密位法 dex 加密隐藏 dex 嵌入异常汇编法 资源混淆法 禁止调试与模拟器检测 附录资料 安卓破解常用工具软件 加固 apk 实例 引言 安卓应用防止破解和重打包可以选择梆梆加固、阿里聚安全、爱加密等成熟解决方案,他们的加固比较彻底,使用的技术也比较深层次,所以破解难度也很大,但是有可能带来应用不稳定的问题,所以周期长。 如果不选择梆梆加固等的成熟方案,那么可以选择将一些防破解和重打包的对抗技术组合使用,虽然不如成熟方案层次深,但是使用简单,周期短,防住普通破解者也有不错的效果。 这里将一些这样的防破解技术整理如下,仅供参考。 每个技术都标注了易用性和防破解效果,易用性越高表明越容易实现,防破解效果越高表明攻击者越难破解。其中易用性越高表明越容易开发实现,防破解能力越高表明攻击者越难破解。 防破解技术汇集

关键逻辑放服务端 尽可能将关键的逻辑代码放在服务端运行,减少敏感代码暴露在客户端。让客户端只做一些 API 请求和界面交互。 易用性:高 防破解能力:中 用 native code 替代 Java 代码 将一部分关键的或者计算密集型的代码用 native code (Android NDK)来编写,不仅能提高运行效率,也能增加攻击者的逆向难度。 易用性:中 防破解能力:高 代码混淆 Java 代码混淆 安卓标配了 proguard,推荐使用。 易用性:高 防破解能力:中 native code混淆 对 native code 做混淆,开源工具有:https://https://www.360docs.net/doc/276890993.html,/obfuscator-llvm/obfuscator/wiki 根据经验,这会让破解难度大大增加。 易用性:中 防破解能力:高 运行前做完整性校验,防止重打包

(完整版)阿里巴巴编码规范(Java)题库

多选 1.如何处理单元测试产生的数据,下列哪些说法是正确的?ABC A .测试数据入库时加特殊前缀标识。 B .测试数据使用独立的测试库。 C .自动回滚单元测试产生的脏数据。 D .无须区别,统一在业务代码中进行判断和识别。 多选 2.关于并发处理,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .线程资源必须通过线程池提供,不允许在应用中自行显式创建线程。 B .同步处理时,能锁部分代码区块的情况下不要锁整个方法;高并发时,同步调用应该考虑到性能损耗。 C .创建线程或线程池时,推荐给线程指定一个有意义的名称,方便出错时回溯。 D .推荐使用Executors.newFixedThreadPool(int x)生成指定大小的线程池。(线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式) 多选 3.下列哪些说法符合《阿里巴巴Java开发手册》:ACD A .对于“明确停止使用的代码和配置”,如方法、变量、类、配置文件、动态配置属性等要坚决从程序中清理出去,避免造成过多垃圾。 B .永久弃用的代码段注释掉即可,即不用加任何注释。 C .对于暂时被注释掉,后续可能恢复使用的代码片断,在注释代码上方,统一规定使用三个斜杠(///)来说明注释掉代码的理由。 D .不要在视图模板中加入任何复杂的逻辑。 多选 4.关于分页查询,下列哪些说法符合《阿里巴巴Java开发手册》:ABC A .分页查询,当统计的count为0时,应该直接返回,不要再执行分页查询语句。 B .iBATIS自带的queryForList(String statementName,int start,int size)分页接口有性能隐患,不允许使用。 C .定义明确的sql查询语句,通过传入参数start和size来实现分页逻辑。 D .可使用存储过程写分页逻辑,提高效率。

JAVA代码混淆文档

JAVA代码混淆 1.ProGuard 简介: 是一款免费的Java类文件压缩器、优化器和混淆器。它能发现并删除无用类、字段(field)、方法和属性值(attribute)。它也能优化字节码并删除无用的指令。最后,它使用简单无意义的名字来重命名类名、字段名和方法名。经过以上操作的jar文件会变得更小,并很难进行逆向工程。它支持脚本控制,可以使用GUI界面,与eclipse集成,支持J2ME。 价格: 免费 使用方式: 1、使用图形界面,如下图:

2、使用脚本语句,将执行脚本语句加入相应脚本中执行,例如加入ant、maven项目自动 构建中,在项目部署前混淆代码。 应用情况: 1、需要对配置项了解具体含义; 2、不需要混淆的属性、方法、类,需要在.pro配置文件中说明; 3、混淆方式为项目打包后再混淆; 4、不能与myeclipse、eclipse集成使用; 5、可以在ant、maven中的配置文件中添加脚本语句使用(编写相应的.Pro文件,增加 ProGuard的执行jar文件); 6、混淆时将无用的语句去除,优化方法间结构; 7、混淆内容:属性、方法名称、类名称,对方法过程不做混淆处理,混淆力度不大。2.Jocky 简介: 在Sun JDK中提供的Java编译器(javac)的基础上完成的,修改了其中的代码生成过程,对编译器生成的中间代码进行混淆,最后再生成class文件,这样编译和混淆只需要一个步骤就可以完成。 价格: 免费 使用方式: 1、在myeclipse与eclipse中使用安装插件方式,使用Jocky混淆。如图:

使用后会生成配置文件,用于混淆设置使用,该配置文件类似ant 配置文件,如下图: 混淆等级有5种(public、private、package、protected、all)。 2、使用命令行或者脚本,将命令行加入脚本中执行,如在ant配置文件中加入执行脚本后 可以执行混淆程序。执行脚本如下图: 目前在maven中暂不能使用Jocky混淆。

华为JAVA编码规范

1.程序块采用缩进风格,空格为4个. 说明: 对于开发工具自动生成的代码可以不一致 2.分界符(如大括号{和})应各自占一行并且在同一列,同时与引用它们的语句左 对齐,在方法的开始,类和接口的定义,以及if,for,do,while,switch,case语句都要采用上述缩进 说明: for(…) { …//your code } 3.较长(>80字符)的语句,表达式和参数要分多行,长表达式要在低优先级操作符 划分新行,操作符放在行首,新行要适当缩进,整齐,语句可读. 说明: if(filename != null && new File(logPath+filename).length() < logConfig.getFileSize()) { …//your code } 4.一行只写一条语句 说明: LogFilename wow = null; LogFilename that = null; 5.if,for,do,switch,while,case,default各占一行,它们的执行语句无论多少都要加{} 说明: if(writeToFile) { writeFileThread.interrupt(); } 6.相对独立的程序块,变量,说明要加空行 说明: if(log.getLevel() < log.getRecord()) { return ; } //空行

LogWrite writer; 7.对齐只用空格键,不用TAB键 说明: 以免使用不同的编辑器阅读程序时,因TAB键所设置的空格数不同而造成程序布局不整齐,JBuildr,UltraEdit等编辑环境,支持行首TAB替换成空格,应将该选项打开 8.两个以上的关键字,变量,常量进行对等操作时,操作符之前,之后或前后要加空 格,进行非对等操作时,如果是关系密切的立即操作符,后面不加空格(如.操作符) 说明: 采用这种松散方式编写代码目的是让程序更加清晰,由于空格所产生的清晰性是相对的,所以在已经很清晰的语句中没有必要留空格,如果语句已足够清晰,则括号内侧(即左括号后面和右括号前面)不需要加空格,多重括号间不必加空格,因为java中括号已经是很清晰的标志了.在长句中,如果需要加的空格非常多,那么应该保持整体清晰,而在局部中不加空格,给操作符留空格时不要连续留两个以上空格 9.类属性和方法不要交叉放置,不同存取范围的属性和方法也不要交叉放置 说明: 类定义:{ 类公有属性定义; 类保护属性定义; 类私有属性定义; 类公有方法定义; 类保护方法定义; 类私有方法定义; } 10.源程序的有效注释量必须在30%以上 11.包的注释写入一个名为package.html的html格式的说明文件放入当前路径 12.包的注释内容:本包作用,详细描述本包内容,产品模块名称及版本,公司版本 说明: 一句话描述 详细描述 产品模块
公司版本信息

java编译混淆

Java是一种跨平台的、解释型语言。Java 源代码编译中间“字节码”存储于class文件中。Class 文件是一种字节码形式的中间代码,该字节码中包括了很多源代码的信息,例如变量名、方法名等。因此,Java中间代码的反编译就变得非常容易。目前市场上有许多免费的、商用的反编译软件,都能够生成高质量的反编译后的源代码。所以,对开发人员来说,如何保护Java程序就变成了一个非常重要的挑战。本文首先讨论了保护Java程序的基本方法,然后对代码混淆问题进行深入研究,最后结合一个实际的应用程序,分析如何在实践中保护Java 程序。 反编译成为保护Java程序的最大挑战 通常C、C++等编程语言开发的程序都被编译成目标代码,这些目标代码都是本机器的二进制可执行代码。通常所有的源文件被编译、链接成一个可执行文件。在这些可执行文件中,编译器删除了程序中的变量名称、方法名称等信息,这些信息往往是由内存地址表示,例如如果需要使用一个变量,往往是通过这个变量的地址来访问的。因此,反编译这些本地的目标代码就是非常困难的。 Java语言的出现,使得反编译变得非常容易而有效。原因如下:1.由于跨平台的需求,Java的指令集比较简单而通用,较容易得出程序的语义信息;2.Java编译器将每一个类编译成一个单独的文件,这也简化了反编译的工作;3.Java 的Class文件中,仍然保留所有的方法名称、变量名称,并且通过这些名称来访问变量和方法,这些符号往往带有许多语义信息。由于Java程序自身的特点,对于不经过处理的Java程序反编译的效果非常好。 目前,市场上有许多Java的反编译工具,有免费的,也有商业使用的,还有的是开放源代码的。这些工具的反编译速度和效果都非常不错。好的反编译软件,能够反编译出非常接近源代码的程序。因此,通过反编译器,黑客能够对这些程序进行更改,或者复用其中的程序。因此,如何保护Java程序不被反编译,是非常重要的一个问题。 常用的保护技术 由于Java字节码的抽象级别较高,因此它们较容易被反编译。本节介绍了几种常用的方法,用于保护Java字节码不被反编译。通常,这些方法不能够绝对防止程序被反编译,而是加大反编译的难度而已,因为这些方法都有自己的使用环境和弱点。 隔离Java程序 最简单的方法就是让用户不能够访问到Java Class程序,这种方法是最根本的方法,具体实现有多种方式。例如,开发人员可以将关键的Java Class放在服务器端,客户端通过访问服务器的相关接口来获得服务,而不是直接访问Class文件。这样黑客就没有办法反编译Class文件。目前,通过接口提供服务的标准和协议也越来越多,例如HTTP、Web Service、RPC等。但是有很多应用都不适合这种保护方式,例如对于单机运行的程序就无法隔离Java 程序。这种保护方式见图1所示。

(完整word版)JAVA代码规范详细版

JAVA代码规范 本Java代码规范以SUN的标准Java代码规范为基础,为适应我们公司的实际需要,可能会做一些修改。本文档中没有说明的地方,请参看SUN Java标准代码规范。如果两边有冲突,以SUN Java标准为准。 1. 标识符命名规范 1.1 概述 标识符的命名力求做到统一、达意和简洁。 1.1.1 统一 统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。 1.1.2 达意 达意是指,标识符能准确的表达出它所代表的意义,比如:newSupplier, OrderPaymentGatewayService等;而supplier1, service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。 1.1.3 简洁 简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长,transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。 1.1.4 骆驼法则 Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: supplierName, addNewContract,而不是supplier_name, add_new_contract。

Python 代码混淆和加密技术

Python 代码混淆和加密技术 动机 Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站。加我要! 同时需要注意的是, 这个混淆其实还是被很多人怀疑的, 因为即使混淆了, 也没有改变代码的结构. 这种方法只能”防君子,不防小人“ 所以, 必要的话, 在编程的时候, 可以故意做点提高逆向难度的事情: 结构稍微改变, 合并几个类到同一个文件. 面向对象的结构中, 偶尔穿插一些无伤大雅的范式编程风格. 加密 1. 最基本的方法是发布pyc文件, 也就是将所有的.py源文件转换成pyc对外发布. pyc有一个局限性是依赖于python解析器的版本, 使用某一个版本的python解释器生成的pyc必须要在相同版本下的python解释器下才可以正常工作. 使用上述方法可以方便的生成pyc, 初步的隐藏代码了. 不过pyc依然可以被容易的破解 2. 另一种方案是借助cython. Cython是属于PYTHON的超集,cython可以将python文件转换成c, 并编译成pyd文件. 一般将核心模块编译成pyd, 这样被破解的风险就大大降低了. 优势:资源丰富,适合快速开发。翻译成C后速度比较快。缺点是:无法支持JIT技术(导致纯python的执行速度比JAVA、JAVASCRIPT 等要慢,于是有了PyPy) 有一个经验之谈, 你可以将所有每个模块中的某个一个位置的变量抽出, 放到一个python文件中, 使用cython来处理这个文件. 这样就会增加破解者从其

java代码规范要求(公司用-补充版)

代码规范要求 为保证我公司研发代码的规范性、可读性,特制定该代码规范: 1、代码应遵循国际java代码规范 2、代码中所有switch(param){case int:break;}中case 参数应该为在类开始时定义的字符串,以增加后续研发中的可读性。例:private final int company=0; switch(param){case company:break;}不允许出现case0,case1等字样。 3、在对数据库进行大量数据读取时,应采用jdbc方式读取。以增快响应速度,减少内存消耗。数据量超过万单位时必须采用jdbc读取数据库,且应分页读取数据库。 4、方法作用必须注释,方法中传递的参数应该有注释,全局变量,局部变量都应有注释,以说明变量的意义。如方法会被多次调用,或应对二次开发则应注明返回值例:return Boolean true成功false失败; 5、代码中应该采用try catch捕获异常,且应该处理常见异常。 6、代码呈现页面不能出现null字样。 7、代码测试应用及所需捕获异常或输出信息应该采用log4j 进行输出。杜绝出现System.out.println();字样 8、代码不应出现重复定义,同一方法不能多次调用数据库,

如一个方法中需要多次调用数据库则应拆分为两个或多个。 9、同一方法中代码量超过50行则应进行拆分。 10、代码应该采用format格式化。 11、代码已经提交或二次开发时,应注明修改时间修改人修改原因修改后提交参数的内容 12、在未进行实例化的参数判断是否为空时,应该null在前例:if(null!=param) 13、在判断变量是否为空时,尽量避免采用if else应采用Parame==null?”0”:parame;进行判断赋值 14、代码应遵循可读性原则,不能出现过于冗长的代码。 15、多次在不同类中反复调用且内容相同的方法,应该写到公用代码中进行调用。 16、已经失效,且不会被调用的代码应该注销、删除。 17、代码在未经测试时,不要进行提交,以免造成现调用的其他类出现错误。 18、项目的配置文档应该遵循规范格式,尽量增加注释。 19、页面中的js脚本应该具备可读性、增加注释。Js脚本的规范遵从国际js规范。 20、页面中提交的必要的变量参数应该有验证。 21、页面提交的信息或执行时间较长、页面上传文档时应该提示用户正在执行等字样。 22、页面ext的方法复写定义应该在项目中为唯一,不得出

Java代码规范详细版

Java代码规范 1. 标识符命名规范 1.1 概述 标识符的命名力求做到统一、达意和简洁。尽量做到每个人按照规范来,多人开发如一人开发一样。 1.1.1 统一 统一是指,对于同一个概念,在程序中用同一种表示方法,比如对于供应商,既可以用supplier,也可以用provider,但是我们只能选定一个使用,至少在一个Java项目中保持统一。统一是作为重要的,如果对同一概念有不同的表示方法,会使代码混乱难以理解。即使不能取得好的名称,但是只要统一,阅读起来也不会太困难,因为阅读者只要理解一次。 1.1.2 达意 达意是指,标识符能准确的表达出它所代表的意义,比如:newSupplier, OrderPaymentGatewayService等;而supplier1, service2,idtts等则不是好的命名方式。准确有两成含义,一是正确,而是丰富。如果给一个代表供应商的变量起名是order,显然没有正确表达。同样的,supplier1, 远没有targetSupplier意义丰富。 1.1.3 简洁 简洁是指,在统一和达意的前提下,用尽量少的标识符。如果不能达意,宁愿不要简洁。比如:theOrderNameOfTheTargetSupplierWhichIsTransfered 太长,transferedTargetSupplierOrderName则较好,但是transTgtSplOrdNm就不好了。省略元音的缩写方式不要使用,我们的英语往往还没有好到看得懂奇怪的缩写。 1.1.4 骆驼法则 Java中,除了包名,静态常量等特殊情况,大部分情况下标识符使用骆驼法则,即单词之间不使用特殊符号分割,而是通过首字母大写来分割。比如: supplierName, addNewContract,而不是supplier_name, add_new_contract。 1.1.5 英文vs 拼音

相关文档
最新文档