各种加密算法比较

各种加密算法比较

算法选择:对称加密AES,非对称加密: ECC,消息摘要: MD5,数字签名:DSA 对称加密算法(加解密密钥相同) 名称 密钥长度 运算速度 安全性 资源消耗 DES 56位 较快 低 中 3DES 112位或168位 慢 中 高 AES 128、192、256位 快 高 低 非对称算法(加密密钥和解密密钥不同) 名称 成熟度 安全性(取决于密钥长度) 运算速度 资源消耗 RSA 高 高 慢 高 DSA 高 高 慢 只能用于数字签名 ECC 低 高 快 低(计算量小,存储空间占用小,带宽要求低) 散列算法比较 名称 安全性 速度 SHA-1 高 慢 MD5 中 快 对称与非对称算法比较 名称 密钥管理 安全性 速度 对称算法 比较难,不适合互联网,一般用于内部系统 中 快好几个数量级(软件加解密速度至少快100倍,每秒可以加解密数M比特数据),适合大数据量的加解密处理 非对称算法 密钥容易管理 高 慢,适合小数据量加解密或数据签名 算法选择(从性能和安全性综合) 对称加密: AES(128位), 非对称加密: ECC(160位)或RSA(1024), 消息摘要: MD5 数字签名:DSA 轻量级:TEA、RC系列(RC4),Blowfish (不常换密钥) 速度排名(个人估测,未验证):IDEA <DES <GASTI28<GOST<AES<RC4<TEA<Blowfish 简单的加密设计: 用密钥对原文做 异或,置换,代换,移位 名称 数据大小(MB) 时间(s) 平均速度MB/S 评价 DES 256 10.5 22.5 低 3DES 256 12 12 低 AES(256-bit) 256 5 51.2 中 Blowfish 256 3.7 64 高 表5-3 单钥密码算法性能比较表 名称 实现方式 运算速度 安 全 性 改进措施 应用场合 DES 40-56bit 密钥 一般 完全依赖密钥,易受穷举搜索法攻击 双重、三重DES,AES 适用于硬件实现 IDEA 128bit密钥 8轮迭代 较慢 军事级,可抗差值分析和相关分析 加长字长为32bit、密钥为256bit,采用232 模加、232+1模乘 适用于ASIC设计 GOST 256bit密钥 32轮迭代 较快 军事级 加大迭代轮数 S盒可随机秘 密选择,便于软件实现 Blowfish 256-448bit 密钥、16轮迭代 最快 军事级、可通过改变密钥长度调整安全性 适合固定密钥场合,不适合常换密钥和智能卡 RC4 密钥长度可变 快DESl0倍 对差分攻击和线性攻击具有免疫能力,高度非线性 密钥长度放宽到64bit 算法简单,易于编程实现 RC5 密钥长度和迭代轮数均可变 速度可根据 三个参数的 值进行选择 六轮以上时即可抗线性攻击、通过调整字长、密钥长度和迭代轮数可以在安全性和速度上取得折中 引入数据相倚转 适用于不同字长的微处理器 CASTl28 密钥长度可变、16轮迭代 较快 可抵抗线性和差分攻击 增加密钥长度

聊聊G1 GC的String Deduplication

聊聊G1 GC的String Deduplication

序 本文主要研究一下G1 GC的String Deduplication -XX:+UseStringDeduplication jdk8u20给G1 GC带来了String Deduplication特性来将相同的字符串指向同一份数据,来减少重复字符串的内存开销 该特性默认是关闭的,可以使用-XX:+UseStringDeduplication来开启(前提是使用-XX:+UseG1GC) 具体的实现大致是JVM会记录char[]的weak reference及hash value,当找到一个hash code相同的String时,就会挨个char进行比较,当所有都match,那么其中一个String就会修改指针指向另一个String的char[],这样前者的char[]就可以被回收 实例 实验代码 @Test public void testG1StringDeduplication() throws InterruptedException { List<String> data = IntStream.rangeClosed(1,10000000) .mapToObj(i -> "number is " + ( i % 2 == 0 ? "odd" : "even")) .collect(Collectors.toList()); System.gc(); long bytes = RamUsageEstimator.sizeOfAll(data); System.out.println("string list size in MB:" + bytes*1.0/1024/1024); System.out.println("used heap size in MB:" + ManagementFactory.getMemoryMXBean().getHeapMemoryUsage().getUsed()*1.0/1024/1024); System.out.println("used non heap size in MB:" + ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage().getUsed()*1.0/1024/1024); } 关闭StringDeduplication -XX:+UseG1GC -XX:-UseStringDeduplication 输出如下: string list size in MB:586.8727111816406 used heap size in MB:831.772346496582 used non heap size in MB:6.448394775390625 整个jvm heap占用了约831MB,其中string list占用了约586MB 开启StringDeduplication -XX:+UseG1GC -XX:+UseStringDeduplication 输出如下: string list size in MB:296.83294677734375 used heap size in MB:645.0970153808594 used non heap size in MB:6.376350402832031 整个jvm heap占用了约645MB,其中string list占用了约296MB 小结 jdk8u20给G1 GC带来了String Deduplication特性来将相同的字符串指向同一份数据,来减少重复字符串的内存开销 该特性默认是关闭的,可以使用-XX:+UseStringDeduplication来开启(前提是使用-XX:+UseG1GC) 在有大量重复string的前提下,使用G1 GC开启String Deduplication确实能够节省一定的内存,可

Logback 详细颜色配置

Logback 详细颜色配置

首先,看一段真实的配置 1 <?xml version="1.0" encoding="UTF-8"?> 2 <configuration debug="true"> 3 <springProperty scope="context" name="logLevel" source="log.level"/> 4 <springProperty scope="context" name="logPath" source="log.path"/> 5 6 <!-- 输出格式 --> 7 <property name="out.pattern" value="%d{yyyy-MM-dd HH:mm:ss.SSS} [%-5p] [%t] [%c][%L] - %m%n" /> 8 <!-- 活动文件的大小 --> 9 <property name="max.file.size" value="500MB"/> 10 <!-- 保留的归档文件的最大数量 --> 11 <property name="max.history" value="30"/> 12 <!-- 控制所有归档日志文件的总大小 --> 13 <property name="total.size.cap" value="30GB"/> 14 15 <!-- 控制台 --> 16 <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender"> 17 <withJansi>true</withJansi> 18 <encoder> 19 <pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} [%highlight(%-5p)] [%t] [%cyan(%c)][%L] - %m%n</pattern> 20 </encoder> 21 </appender> 22 23 <!-- DEBUG日志 --> 24 <appender name="DEBUG_FILE" class="ch.qos.logback.core.rolling.RollingFileAppender"> 25 <file>${logPath}/debug.log</file> 26 <filter class="ch.qos.logback.classic.filter.LevelFilter"> 27 <level>DEBUG</level> 28 <onMatch>ACCEPT</onMatch> 29 <onMismatch>DENY</onMismatch> 30 </filter> 31 <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy"> 32 <fileNamePattern>${logPath}/debug.%d{yyyy-MM-dd}.%i.log</fileNamePattern> 33 <maxFileSize>${max.file.size}</maxFileSize> 34 <maxHistory>${max.history}</maxHistory> 35 <totalSizeCap>${total.size.cap}</totalSizeCap> 36 </rollingPolicy> 37 <encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder"> 38 <pattern>${out.pattern}</pattern> 39 <charset>UTF-8</charset> 40 </encoder> 41 </appender> 42 43 <!-

一篇文章带你学习分布式事务

一篇文章带你学习分布式事务

一. 事务 1.1 什么是事务 数据库事务(简称:事务,Transaction)是指数据库执行过程中的一个逻辑单位,由一个有限的数据库操作序列构成。 事务拥有以下四个特性,习惯上被称为 ACID 特性: 1.原子性(Atomicity):事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。 2.一致性(Consistency):事务应确保数据库的状态从一个一致状态转变为另一个一致状态。一致状态是指数据库中的数据应满足完整性约束。除此之外,一致性还有另外一层语义,就是事务的中间状态不能被观察到(这层语义也有说应该属于原子性)。 3.隔离性(Isolation):多个事务并发执行时,一个事务的执行不应影响其他事务的执行,如同只有这一个操作在被数据库所执行一样。 4.持久性(Durability):已被提交的事务对数据库的修改应该永久保存在数据库中。在事务结束时,此操作将不可逆转。 1.2 本地事务 起初,事务仅限于对单一数据库资源的访问控制: 架构服务化以后,事务的概念延伸到了服务中。倘若将一个单一的服务操作作为一个事务,那么整个服务操作只能涉及一个单一的数据库资源: 这类基于单个服务单一数据库资源访问的事务,被称为本地事务(Local Transaction)。 二. 分布式事务应用架构 本地事务主要限制在单个会话内,不涉及多个数据库资源。但是在基于 SOA(Service-Oriented Architecture,面向服务架构)的分布式应用环境下,越来越多的应用要求对多个数据库资源,多个服务的访问都能纳入到同一个事务当中,分布式事务应运而生。 最早的分布式事务应用架构很简单,不涉及服务间的访问调用,仅仅是服务内操作涉及到对多个数据库资源的访问。 当一个服务操作访问不同的数据库资源,又希望对它们的访问具有事务特性时,就需要采用分布式事务来协调所有的事务参与者。 对于上面介绍的分布式事务应用架构,尽管一个服务操作会访问多个数据库资源,但是毕竟整个事务还是控制在单一服务的内部。如果一个服务操作需要调用另外一个服务,这时的事务就需要跨越多个服务了。在这种情况下,起始于某个服务的事务在调用另外一个服务的时候,需要以某种机制流转到另外一个服务,从而使被调用的服务访问的资源也自动加入到该事务当中来。下图反映了这样一个跨越多个服务的分布式事务: 如果将上面这两种场景(一个服务可以调用多个数据库资源,也可以调用其他服务)结合在一起,对此进行延伸,整个分布式事务的参与者将会组成如下图所示的树形拓

Locale深度解析

Locale深度解析

摘要 Locale是日常开发中比较容易忽视的技术点。特别是开发一些只做国内市场,只有中文的项目时,Locale可能就直接被忽视了。而且在项目提出多语言支持的时候,因为没有很好的理解,可能给自己埋了很多坑。 什么是Locale 其实java.util.Locale的Java Doc有很详细的解释,我就不过多解释。 A Locale object represents a specific geographical, political, or cultural region. An operation that requires a Locale to perform its task is called locale-sensitive and uses the Locale to tailor information for the user. 主要记住Locale实例包括以下信息就可以了。在多年的开发经验中,script和variant基本没有用到。就不过多介绍。 language script country (region) variant lanugage ISO 639 alpha-2 or alpha-3 language code 在实际使用中,基本我们碰不到3位字母表示的语言。 country ISO 3166 alpha-2 country code or UN M.49 numeric-3 area code. 同样实际使用中,基本使用2位字母表示的国家 scirpt 和 variant IANA Language Subtag Registry 定义了完整列表。 感觉script是地区的别称,variant是方言。了解一下就好。 在实际使用中,大部分同学第一反应可能是会写出以下Locale。 zh_CN en_US ja_JP 如果你也是只想到这些,请打开你的浏览器->开发者工具->控制台中输入以下js window.navigator.language 浏览器为中文,你又在国内。输出结果就是zh-CN 然后如果重新你设置浏览器语言,比如设置成英文。再执行一下,输出结果是en-CN What?? en-CN?? 这是什么鬼? 首先通过这个Locale,我们可以知道country,是和你实际在哪个地区有关。 那该怎么处理? 后面详细说怎么应用。 应用场景 Locale的使用场景基本就是根据不同国家和语言,进行不同的显示。实际经验以下2点为主。 多语言 (下文会详细说明) 金额显示。 日期格式显示。 以金额显示为例,如果没有类似开发经验的话,你可以为会想,金额还有不同的格式。一般不都是 1,000,000.00。那你就错了。举两个例子。 日语。日本人金额是不带小数点的。 法语。法语中千位分隔符为空格,小数点为逗号。比如 1 000 000,00 正确理解Locale,并正确使用可以写出既规范,又简练,质量又高的代码。而不是见招拆招,每个语言写一个自己的实现。 创建Locale 实例的正确姿势 使用正确的姿势创建非常重要,这在后面Spring里应用部分非常重要。 以下这段代码是我见过最多的创建方式。 Locale locale = n

联系我们

联系电话

4000-640-466

联系邮箱

service@f-li.cn

办公地址

上海黄浦区外滩源1号

谢谢,您的信息已成功发送。
请填写信息。