密码学,证书(数字签名X509、P7、P12,认证),国际RSA、AES、Hash,国密标准SM4等

  在金融,银行,电子支付方面可能会涉及Message Digest(消息摘要)、Digital Signature(数字签名)、KeyStore、CA(Certificate Authority)等。现有的技术信任体系,CA认证、电子签名、电子存证、生物识别等
  标准的openssl PEM格式的密钥与密钥的 DER 编码?
Java科普之加密算法- http://blog.csdn.net/reboot123/article/details/51690117
> 密码学
  密码学是一门难以理解的学科,因为它充满了数学定理。但是除非你要实际开发出一套加密算法系统,否则你是没必要强制理解那些深奥的数学定理的。

   公钥密码学则与以前的所有方法都截然不同。一方面公开密钥算法基于数学函数而不是替代和置换,更重要的是,公开密钥密码学是非对称的,它用到两个不同的密钥,而对称的常规加密则只使用一个密钥。使用两个密钥对于保密通信,密钥分配和鉴别等领域都有着深远的影响。
 -- 密码学的三大作用:加密( Encryption)、认证(Authentication),鉴定(Identification) 
 1.加密:防止坏人获取你的数据。 
 2.认证:防止坏人修改了你的数据而你却并没有发现。 
 3.鉴权:防止坏人假冒你的身份。
 明文、密文、密钥、对称加密算法、非对称加密算法。

-- openSSL、GLTLS、polarssl等
TLS 1.0 RFC- http://www.ietf.org/rfc/rfc2246.txt
TLS 1.1 RFC- http://www.ietf.org/rfc/rfc4346.txt
TLS 1.2 RFC- http://www.ietf.org/rfc/rfc5246.txt。

-- 安全套接字层(SSL Secure Sockets Layer)和传输层安全性(TLSTransport Layer Security)  
  安全套接字层 (SSL):一种由 Netscape Communications 开发的提议开放式标准,用以建立安全通讯通道,以防止如信用卡号等这样的重要信息被截获。
  安全套接字层是用于服务器之上的一个加密系统,它可以确保在客户机与服务器之间传输的数据仍然是安全与隐密的。要使服务器和客户机使用 SSL 进行安全的通信,服务器必须有两样东西:
  1.密钥对(Key pair) —— 一个密钥对包括一个公钥和一个私钥。这两个密钥用来对消息进行加密和解密,以确保在因特网上传输时的隐密性和机密性。
  2.证书(Certificate) —— 证书用来进行身份验证或者身份确认。证书可以是自签(self-signed)证书,也可以是颁发(issued)证书。自签证书是为自己私有的 Web 网络创建的证书。颁发证书是认证中心(certificate authority,CA)或者证书签署者提供(颁发)给您的证书。

 SSL 使用安全握手来初始化客户机与服务器之间的安全连接。在握手期间,客户机和服务器对它们将要为此会话使用的密钥及加密方法达成一致。客户机使用服务器证书验证服务器。握手之后,SSL 被用来加密和解密 HTTPS(组合 SSL 和 HTTP 的一个独特协议)请求和服务器响应中的所有信息,包括:
  1.客户机正在请求的 URL。
  2.提交的表单的内容。
  3.访问授权信息(比如用户名和密码)。
  4.所有在客户机与服务器之间发送的数据。

   SSL:(Secure Socket Layer,安全套接字层),位于可靠的面向连接的网络层协议和应用层协议之间的一种协议层。SSL通过互相认证、使用数字签名确保完整性、使用加密确保私密性,以实现客户端和服务器之间的安全通讯。该协议由两层组成:SSL记录协议和SSL握手协议。
   TLS:(Transport Layer Security,传输层安全协议),用于两个应用程序之间提供保密性和数据完整性。该协议由两层组成:TLS记录协议和TLS握手协议。
   SSL是Netscape开发的专门用户保护Web通讯的,目前版本为3.0。最新版本的TLS 1.0是IETF(工程任务组)制定的一种新的协议,它建立在SSL 3.0协议规范之上,是SSL 3.0的后续版本。两者差别极小,可以理解为SSL 3.1,它是写入了RFC的。

> CA 与 PKI 体系
安全与加密,openssl编程- https://blog.csdn.net/aixiaoxiaoyu/article/category/7346344

OpenSSL证书的生成和管理可以参考:http://www.ibm.com/developerworks/cn/java/j-certgen/
openssl建立多级CA签发证书?keytool制作CA根证书以及颁发二级证书?OpenSSL生成根证书CA及签发子证书?
HTTPS协议详解(三):PKI 体系- https://blog.csdn.net/hherima/article/details/52469488
 HTTPS的作用:它的主要作用可以分为两种:一种是建立一个信息安全通道,来保证数据传输的安全;另一种就是确认网站的真实性。 SSL,Https,配置服务器证书.
 TLS/SSL的功能实现主要依赖于三类基本算法:散列函数 Hash、对称加密和非对称加密,其利用非对称加密实现身份认证和密钥协商,对称加密算法采用协商的密钥对数据加密,基于散列函数验证信息的完整性。
  CA 负责核实公钥的拥有者的信息,并颁发认证"证书",同时能够为使用者提供证书验证服务,即PKI体系(PKI基础知识)。基本的原理为,CA负责审核信息,然后对关键信息利用私钥进行"签名",公开对应的公钥,客户端可以利用公钥验证签名。CA也可以吊销已经签发的证书,基本的方式包括两类 CRL 文件和 OCSP文件

-- CA数字证书,包括机构证书、个人证书、业务证书:
(1)机构证书:USB-KEY介质,用于进行机构身份识别,进行机构内部账号权限管理等。
(2)个人证书:USB-KEY介质,用于进行个人身份识别,进行账号权限管理等。    
(3)业务证书:无介质,存储在加密设备上,用于对数据电文进行签名。

-- 证书(比如CA的根证书)通常有两种格式:
(1)二进制格式,一般用于OS X 和 平台的Security framework等密码工具集。二进制格式的证书有许多种名字(包括BER, DER, CER 等等),对应的有许多种扩展名称 (.cer, .der, .crt 等等)。
(2)文本格式,一般用于OpenSSL工具集。文本格式的证书名字为PEM,标准的扩展名称为.pem,但是PEM文件可能不仅仅保存了证书(PEM files can hold more than just certificates),一个仅仅保存了证书的PEM文件通常的扩展名为.crt。

-- CA是PKI的核心执行机构,是PKI的主要组成部分,而数字证书是由CA颁发的。
  PKI 主要包括四个部分:1.X.509 格式的证书(X.509 V3)和证书废止列表CRL(X.509 V2);2.CA 操作协议;3.CA 管理协议;4.CA 政策制定。
  CA 是PKI 的核心,CA 的核心功能就是发放和管理数字证书。

  完整的PKI系统必须具有权威认证机构(CA)、数字证书库、密钥备份及恢复系统、证书作废系统、应用接口(API)等基本构成部分,构建PKI也将围绕着这五大系统来着手构建。
  PKI的基础技术包括加密、数字签名、数据完整性机制、数字信封、双重数字签名等

-- 一个典型、完整、有效的PKI应用系统至少应具有以下部分:
· 公钥密码证书管理。
· 黑名单的发布和管理。
· 密钥的备份和恢复。
· 自动更新密钥。
· 自动管理历史密钥。
· 支持交叉认证。

-- CA 的核心功能就是发放和管理数字证书,具体描述如下: 
(1)接收验证最终用户数字证书的申请。 
(2)确定是否接受最终用户数字证书的申请-证书的审批。 
(3)向申请者颁发、拒绝颁发数字证书-证书的发放。 
(4)接收、处理最终用户的数字证书更新请求-证书的更新。 
(5)接收最终用户数字证书的查询、撤销。 
(6)产生和发布证书废止列表(CRL)。 
(7)数字证书的归档。 
(8)密钥归档。 
(9)历史数据归档。

> 数字证书(X509、P7、P12等),(加密,数字签名,证书和认证)
  VeriSign, GeoTrust和Thawte是国际权威数字证书颁发认证机构的三巨头。其中应用最广泛的是VeriSign签发的电子商务用数字证书。
数字证书简介及Java编码实现--http://www.cnblogs.com/SirSmith/p/4996392.html
Java 生成数字证书系列(三)生成数字证书-- http://blog.csdn.net/happylee6688/article/details/42266465
java(P12)证书的加密与解密--http://swordshadow.iteye.com/blog/2013575
Java代码产生根证书和签发证书(更新-- http://blog.csdn.net/benweizhu/article/details/7013271
java实现安全证书相关操作-- http://blog.csdn.net/zrbin153/article/details/8998778
  
  Java 6提供了完善的数字证书管理实现,我们几乎无需关注,仅通过操作密钥库和数字证书就可完成相应的加密解密和签名验签过程。
  -- 数字证书的原理:
    数字证书采用公钥体制,即利用一对互相匹配的密钥进行加密、解密。每个用户自己设定一把特定的仅为本人所知的私有密钥(私钥),用它进行解密和签名;同时设定一把公共密钥(公钥)并由本人公开,为一组用户所共享,用于加密和验证签名。当发送一份保密文件时,发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样信息就可以安全无误地到达目的地了。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密.在公开密钥密码体制中,常用的一种是RSA体制。
    用户也可以采用自己的私钥对信息加以处理,由于密钥仅为本人所有,这样就产生了别人无法生成的文件,也就形成了数字签名。采用数字签名,能够确认以下两点:
  (1)保证信息是由签名者自己签名发送的,签名者不能否认或难以否认;
  (2)保证信息自签发后到收到为止未曾作过任何修改,签发的文件是真实文件。

  数字证书类似于个人身份证,由数字证书颁发认证机构(Certificate Authority, CA)签发。只有经过CA签发的证书在网络中才具备可认证性。CA颁发给自己的证书叫根证书。
  数字证书有多种文件编码格式,主要包含CER编码,DER编码等。
  KeyTool与本地密钥库相关联,将私钥存于密钥库,公钥则以数字证书输出。KeyTool位于JDK目录下的bin目录中,需要通过命令行进行相应的操作。

-- 签发证书  
  1)构建自签名证书
  1.申请数字证书之前,需要在密钥库中以别名的方式生成本地数字证书,建立相应的加密算法,密钥,有效期等信息。
  keytool -genkeypair -keyalg RSA -keysize 2048 -sigalg SHA1withRSA -validity 3600 -alias myCertificate -keystore myKeystore.keystore
  各参数含义如下:
-genkeypair   表示生成密钥对
-keyalg     指定密钥算法,这里是RSA
-keysize    指定密钥长度,默认1024,这里指定2048
-sigal      指定签名算法,这里是SHA1withRSA
-validity     指定有效期,单位为天
-alias      指定别名
-keystore     指定密钥库存储位置
  2.打印证书:
  keytool -printcert -file myCer.cer

  2)构建CA签发证书
  1.如果要获取CA机构谁的数字证书,需要将数字证书签发申请(CSR)导出,经由CA机构认证并颁发,将认证后的证书导入本地密钥库和信息库。
keytool -certreq -alias myCertificate -keystore myKeystore.keystore -file myCsr.csr -v
各参数含义如下:
-certreq     表示数字证书申请操作
-alias      指定别名
-keystore     指定密钥库文件路径
-file      指定导出申请的路径
-v         详细信息
  2.获得签发的数字证书后,需要将其导入信任库
keytool -importcert -trustcacerts -alias myCertificate -file myCer.cer -keystore myKeystore.keystore
  3.查看证书
keytool -list -alias myCertificate -keystore myKeystore.keystore

-- 数字签名:
 I.电子商务中数据传输的几个安全性需求
  1. 数据的保密性:用于防止非法用户进入系统及合法用户对系统资源的非法使用;通过对一些敏感的数据文件进行加密来保护系统之间的数据交换,防止除接收方之外的第三方截获数据及即使获取文件也无法得到其内容。如在电子交易中,避免遭到黑客的袭击使信用卡信息丢失的问题。
  2. 数据的完整性:防止非法用户对进行交换的数据进行无意或恶意的修改、插入,防止交换的数据丢失等。
  3. 数据的不可否认性:对数据和信息的来源进行验证,以确保数据由合法的用户发出;防止数据发送方在发出数据后又加以否认;同时防止接收方在收到数据收到后又否认曾过此数据及篡改数据。
  上述需求对应于防火墙、加密、数字签名、身份认证等技术,但其关键在于数字签名技术。

 II.数字签名的含义
  数字签名是通过一个单向函数对要传送的报文进行处理得到的用以认证报文来源并核实报文是否发生变化的一个字母数字串。

 III.数字签名的实现方法
  实现数字签名有很多方法,目前数字签名采用较多的是公钥加密技术,如基于RSA Date Security 公司的PKCS( Public Key Cryptography Standards )、Digital Signature Algorithm、x.509、PGP(Pretty Good Privacy). 1994年美国标准与技术协会公布了数字签名标准(DSS)而使公钥加密技术广泛应用。&127;公钥加密系统采用的是非对称加密算法。 

> Java和Android中的加密和认证,Java Security包 android.security包 ;JCA框架,JCA Provider
  JSSE Provider/Java Harmony provider/Android openssl provider。
  Java相关的东西如Message Digest(消息摘要)、Digital Signature(数字签名)、KeyStore(证书)、CA(Certificate Authority)等。Android平台里与之相关的东西还有一个KeyChain。
  Android上的HTTPS安全连接方式是:OpenSSL + bouncycastle 密钥库管理。

IBM 安全提供者:概述- https://www.ibm.com/developerworks/cn/java/j-ibmsecurity.html

-- JCA框架,JCA Provider
  Android SDK使用的API和JAVA提供的基本相似,由 Java Cryptography Architecture (JCA,java加密体系结构) ,Java Cryptography Extension (JCE,Java加密扩展包) ,Java Secure Sockets Extension(JSSE,Java安全套接字扩展包),Java Authentication and Authentication Service(JAAS,Java 鉴别与安全服务)组成。
  Android API默认的Provider主要是是Bouncy Castle和OpenSSL。

  base64只是一种编码方式,并不是一种加密算法,不要使用base64来加密数据。在Android加密算法中需要随机数时要使用SecureRandom来获取随机数。 Hash算法是指任意长度的字符串输入,此算法能给出固定n比特的字符串输出,输出的字符串一般称为Hash值。
  要确保加密的消息不是别人伪造的,需要提供一个消息认证码(MAC,Message authentication code)。

http:超文本传输协议,广泛用于从WWW服务器传输超文本到本地浏览器的传输协议;
SSL/TLS:最广泛的密码通信方案,综合运用了对称密码、消息认证码、公钥密码、数字签名、伪随机数生成密码等密码技术;
https:在SSL/TLS之上承载HTTP,将两种协议进行叠加;

Java安全(JCA/JSSE):Java加密框架(JCA)简要说明- http://blog.csdn.net/liupingfang126/article/details/71794603
Android实践:Https不再疑惑- http://blog.csdn.net/p106786860/article/details/53057093

-- jce 中的Provider ,Java Security
Java JCE加密用法- http://blog.csdn.net/caolijunmingyan/article/details/7030558
开发一个JCE的Provider- http://www.th7.cn/Program/java/201511/673423.shtml
JCE provider管理的问题- http://flypig.iteye.com/blog/744963
jce 中的Provider- http://m635674608.iteye.com/blog/1844777
数字生活网络联盟EasyDlna共享开源项目说明- http://blog.csdn.net/innost/article/details/40216763
深入理解Android之Java Security第一部分- http://blog.csdn.net/innost/article/details/44081147
深入理解Android之Java Security(第二部分,最后)-http://blog.csdn.net/innost/article/details/44199503

-- openssl  provider
krypt-provider-openssl- https://github.com/krypt/krypt-provider-openssl
Bouncy Castle Java 平台轻量级密码术包- http://free0007.iteye.com/blog/1985643
openssl 制作证书和签名java方法- http://www.cnblogs.com/yangy608/archive/2012/11/16/2773206.html
Java中使用OpenSSL生成的RSA公私钥进行数据加解密- http://blog.csdn.net/chaijunkun/article/details/7275632/

---------  国际算法  -------------
-- 加密算法都有几个共同的要点:
  1.密钥长度;(关系到密钥的强度)
  2.加密模式;(ECB、CBC等等)
  3.块加密算法里的填充方式区分;
> 非对称算法: RSA(公钥加密,私钥解密;私钥签名,公钥验签)

完整的加密传输方式:通过RSA交换密钥,使用AES进行加密处理。
  公钥与私钥的作用是:用公钥加密的内容只能用私钥解密,用私钥加密的内容只能用公钥解密。秘钥分发问题。用公钥加密的文件只能用私钥解密,而私钥加密的文件只能用公钥解密。(对于别人来说,他只能用我的公钥加密数据(拿不到我的私钥,私钥暴露出去是不安全的);而对于我来说,我能用我的私钥加密数据;)
非对称算法有:RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)
密钥体制:对称密钥体制和非对称密钥体制。RSA非对称加解密,证书加解密。

RSA与SSL浅析-- http://blog.csdn.net/laughing2333/article/details/52292481
RSA应用场景:SSH(口令登录、密钥登录)。
openssl RSA加密-- http://blog.csdn.net/stormbjm/article/details/46898757
RSA算法原理--http://blog.jobbole.com/42699/  http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html
从KeyStore中提取公私钥并实现RSA加密算法 http://blog.csdn.net/satcon/article/details/7363059
sun.misc.BASE64Decoder.jar   http://download.csdn.net/download/start_baby/4888384
java RSA加密解密实现 - http://blog.csdn.net/wangqiuyun/article/details/42143957/

-- RSA如何生成公钥和私钥,原理:
1. 选择两个素数p=17,q=11
2. 计算乘机n = 17*11 = 187
3. 对n计算欧拉函数φ(n)=(p-1)(q-1) = 160。
4. 选择e,使得e与φ(n)互素且小于φ(n)。选择e=7  (实际应用中n是一个极大数,通常使用65537)
5. 计算d,使得de mod 160=1且d < 160.正确的值是23,这是因为23*7 = 161 = 10*16+1
这样就得出了公钥PU={7,187} 私钥PR={23,187} 
  
  1977年,三位数学家Rivest、Shamir 和 Adleman 设计了一种算法,可以实现非对称加密。
  如果两个正整数,除了1以外,没有其他公因子,我们就称这两个数是互质关系(coprime)。比如,15和32没有公因子,所以它们是互质关系。这说明,不是质数也可以构成互质关系。
  关于互质关系,不难得到以下结论:
  1. 任意两个质数构成互质关系,比如13和61。
  2. 一个数是质数,另一个数只要不是前者的倍数,两者就构成互质关系,比如3和10。
  3. 如果两个数之中,较大的那个数是质数,则两者构成互质关系,比如97和57。
  4. 1和任意一个自然数是都是互质关系,比如1和99。
  5. p是大于1的整数,则p和p-1构成互质关系,比如57和56。
  6. p是大于1的奇数,则p和p-2构成互质关系,比如17和15。
  加密和解密可以使用不同的规则,只要这两种规则之间存在某种对应关系即可,这样就避免了直接传递密钥。
  “对极大整数做因数分解的难度决定了RSA算法的可靠性。换言之,对一极大整数做因数分解愈困难,RSA算法愈可靠
  假设正整数a与质数p互质,因为质数p的φ(p)等于p-1,则欧拉定理可以写成
    这就是著名的费马小定理。它是欧拉定理的特例。
    欧拉定理是RSA算法的核心。理解了这个定理,就可以理解RSA。
    “公钥加密算法”是计算机通信安全的基石,保证了加密数据不会被破解。
  RSA的安全基于大数分解的难度。其公开密钥和私人密钥是一对大素数(100到200个十进制数或更大)的函数。从一个公开密钥和密文中恢复出明文的难度等价于分解两个大素数之积。
  实际应用中,RSA密钥一般是1024位,重要场合则为2048位。因此目前被破解的最长RSA密钥就是768位。
  实际应用中,公钥和私钥的数据都采用ASN.1格式表达(实例)。

  RSA加密算法是一种非对称加密算法。RSA是1977年由罗纳德·李维斯特(Ron Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard Adleman)一起提出的。当时他们三人都在麻省理工学院工作。RSA就是他们三人姓氏开头字母拼在一起组成的。
  对极大整数做因数分解的难度决定了RSA算法的可靠性。

> 对称加密:AES,DES
比较常见的对称加密有:DES、3DES、RC4、AES等等;Windows加密库中,默认则是CBC模式。
-- AES,对称加密
密钥体制:对称密钥体制和非对称密钥体制。
AES多用于商业应用,有EBC(不安全)、CBC、CFB模式;DES属于弱加密,不建议使用在商业上。
JAVA实现AES加密-- http://www.cnblogs.com/freeliver54/archive/2011/10/08/2202136.html
  近些年DES使用越来越少,原因就在于其使用56位密钥,比较容易被破解,近些年来逐渐被AES替代,AES已经变成目前对称加密中最流行算法之一;AES可以使用128、192、和256位密钥,并且用128位分组加密和解密数据。

-- DES:对称加密
DES加密算法java实现(核心算法+源代码)--http://download.csdn.net/detail/the_fire/4907939
SimpleDES 算法 java 实现-- http://blog.csdn.net/rootcn/article/details/8068112
DES算法的实现-- http://blog.csdn.net/kamaliang/article/details/6691653
JAVA实现DES加密和解密实现详解-- http://www.cnblogs.com/langtianya/p/3715975.html

  1971年美国学者塔奇曼 (Tuchman)和麦耶(Meyer)根据信息论创始人香农(Shannon)提出的「多重加密有效性理论」创立的。 DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收费站等领域被广泛应用,以此来实现关键数据的保密,如信用卡持卡人的PIN的加密传输,IC卡与POS间的双向认证、金融交易数据包的MAC校验等,均用到DES算法。DES加密算法是由 IBM 研究在1977年提出的。使用64位(bit)的数据进行加密和解密的,所用的密钥也是64位。并被美国国家标准局宣布为数据加密标准DES,主要用于非国家保密机关。DES密码实际上是Lucifer密码的进一步发展。它是一种采用传统加密方法的区组密码。它的算法是对称的,既可用于加密又可用于解密。
  -- DES密码算法要求主要為以下四点:
    1.提供高质量的数据保护,防止数据未经授权的洩露和未被察觉的修改;
    2.具有相当高的复杂性,使得破译的开销超过可能获得的利益,同时又要便於理解和掌握
    3.DES密码体制的安全性应该不依赖於算法的保密,
    4.其安全性仅以加密密钥的保密為基础实现经济,运行有效,并且适用於多种完全不同的应用。
  DES算法的入口参数有三个:Key、Data、Mode。其中Key為8个字节共64位,是DES算法的工作密钥;Data也為8个字节64位,是要被加密或被解密的数据;Mode為DES的工作方式,有两种:加密或解密。
  
 Openssl库要更明显一点,它的函数名里面就写明了,比如:DES_ncbc_encrypt,一看就知道是cbc模式。JAVA里面也比较清楚:Cipher c = Cipher.getInstance(”DES/CBC/PKCS5Padding”); 也可以看到是CBC模式。
  -- 电子密码本模式ECB算法特点:
    1.每次Key、明文、密文的长度都必须是64位;
    2.数据块重复排序不需要检测;
    3.相同的明文块(使用相同的密钥)产生相同的密文块,容易遭受字典攻击;
    4.一个错误仅仅会对一个密文块产生影响;
  -- 加密反馈模式CFB特点:
    1.每次加密的Pi和Ci不大于64位;
    2.加密算法和解密算法相同,不能适用于公钥算法;
    3.使用相同的密钥和初始向量的时候,相同明文使用CFB模式加密输出相同的密文;
    4.可以使用不同的初始化变量使相同的明文产生不同的密文,防止字典攻击;
    5.加密强度依赖于密钥长度;
    6.加密块长度过小时,会增加循环的数量,导致开销增加;
    7.加密块长度应时8位的整数倍(即字节为单位);
    8.一旦某位数据出错,会影响目前和其后8个块的数据;
  -- 输出反馈模式OFB特点:
    1.与CFB类似,以下都是不同之处;
    2.因为密文没有参与链操作,所以使得OFB模式更容易受到攻击;
    3.不会进行错误传播,某位密文发生错误,只会影响该位对应的明文,而不会影响别的位;
    4.不是自同步的,如果加密和解密两个操作失去同步,那么系统需要重新初始化;
    5.每次重新同步时,应使用不同的初始向量。可以避免产生相同的比特流,避免”已知明文”攻击 ;

  ECB是不推荐的方式,Key相同时,相同的明文在不同的时候产生相同的明文,容易遭到字典攻击;
  CBC由于加入了向量参数,一定程度上抵御了字典工具,但缺点也随之而来,一旦中间一个数据出错或丢失,后面的数据将受到影响;
  CFB与CBC类似,好处是明文和密文不用是8bit的整数倍,中间一个数据出错,只影响后面的几个块的数据;
  OFB比CFB方式,一旦一个数据出错,不会影响后面的数据,但安全性降低;
  因此,推荐使用CFB方式,但每个数据包单独加密,否则一个数据包丢失,需要做很多容错处理;
  当然,具体问题也要具体分析,对于只需要”特定安全性”①,不需要”计算安全性”以上的软件,也可以使用ECB模式;
 
> 哈希算法,摘要算法
摘要算法:常见的有CRC32(32位循环冗余校验),从MD2、MD3、MD4发展而来的MD5(消息摘要算法第五版),SHA1(安全哈希算法)
常用hash算法:MD4,MD5,SHA-1及其他。

  摘要算法:消息摘要算法的主要特征是加密过程不需要密钥,并且经过加密的数据无法被解密,只有输入相同的明文数据经过相同的消息摘要算法才能得到相同的密文。消息摘要算法不存在密钥的管理与分发问题,适合于分布式网络上使用。
  Hash (散列函数):散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

一致性HASH算法的JAVA实现- http://blog.csdn.net/freebird_lb/article/details/7602263
JAVA HASH算法-http://blog.csdn.net/zeng622peng/article/details/6036766
java加密解密——MD5算法- http://blog.csdn.net/javaman_chen/article/details/5939477    
java加密解密——MD5算法- http://www.tuicool.com/articles/zq26zaF
MD5算法原理- http://blog.csdn.net/forgotaboutgirl/article/details/7258109
Java,Android,MD5加密与SHA加密算法(含工具类)- http://blog.csdn.net/android_technology/article/details/52233556

-- 哈希算法中 盐salt:加盐
 具体的操作就是给密码加一个随即的前缀或者后缀,然后再进行hash。这个随即的后缀或者前缀成为“盐”。
 盐不需要保密,只要盐是随机的话,查表,彩虹表都会失效。因为攻击者无法事先知道盐是什么,也就没有办法预先计算出查询表和彩虹表。如果每个用户都是使用了不同的盐,那么反向查表攻击也没法成功。

  最简单、常见的破解方式当属字典破解(Dictionary Attack)和暴力破解(Brute Force Attack)方式。这两种方法说白了就是猜密码。
单单使用哈希函数来为密码加密是不够的,需要为密码加盐来提高安全性,盐的长度不能过短,并且盐的产生应该是随机的。保护用户的密码,最好的办法就是对密码进行加盐哈希.字典攻击或暴力攻击. .... 

当Set接收一个元素时根据该对象的内存地址算出hashCode,看它属于哪一个区间,在这个区间里调用equeals方法。
  若两个对象equals相等,但不在一个区间,根本没有机会进行比较,会被认为是不同的对象。所以Java对于eqauls方法和hashCode方法是这样规定的:
  1.如果两个对象相同,那么它们的hashCode值一定要相同。也告诉我们重写equals方法,一定要重写hashCode方法。
  2.如果两个对象的hashCode相同,它们并不一定相同,这里的对象相同指的是用eqauls方法比较。
public class OverrideEqualHash {
private int x;
private int y;

 public OverrideEqualHash(int x, int y) {
  super();
  this.x = x;
  this.y = y;
 }

 @Override
 public int hashCode() {
  final int prime = 31;
  int result = 1;
  result = prime * result + x;
  result = prime * result + y;
  return result;
 }

 @Override
 public boolean equals(Object obj) {
    if (this == obj){
    return true;
    }

    if (obj == null){
    return false;
    }

    if (getClass() != obj.getClass()){
    return false;
    }

    OverrideEqualHash other = (OverrideEqualHash) obj;
    if (x != other.x){
    return false;
    }

    if (y != other.y){
    return false;
    }

    return true;
  }

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }


  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }
}

public class HashSetAndHashCode {
    public static void main(String[] args) {
    HashSet<OverrideEqualHash> hs2 = new HashSet<OverrideEqualHash>();
    OverrideEqualHash p21 = new OverrideEqualHash(3, 3);
    OverrideEqualHash p22 = new OverrideEqualHash(3, 3);
    OverrideEqualHash p23 = new OverrideEqualHash(3, 5);
    hs2.add(p21);
    hs2.add(p22);
    hs2.add(p23);
    System.out.println(hs2.size());
   }
}

 -- 一致性Hash算法:
  先构造一个长度为2^32 的整数环(这个环被称为一致性Hash环),根据节点名称的Hash值(其分布为[0, 2^32 -1])将服务器节点放置在这个Hash环上,然后根据数据的Key值计算得到其Hash值(其分布也为[0, 2^32 -1]),接着在Hash环上顺时针查找距离这个Key值的Hash值最近的服务器节点,完成Key到服务器的映射查找。这种算法解决了普通余数Hash算法伸缩性差的问题,可以保证在上线、下线服务器的情况下尽量有多的请求命中原来路由到的服务器。
  一致性哈希算法(Consistent Hashing Algorithm)是一种分布式算法,常用于负载均衡。Memcached client也选择这种算法,解决将key-value均匀分配到众多Memcached server上的问题。它可以取代传统的取模操作,解决了取模操作无法应对增删Memcached Server的问题(增删server会导致同一个key,在get操作时分配不到数据真正存储的server,命中率会急剧下降)。

  -- 这里使用红黑树,选用红黑树的原因有两点:
  1、红黑树主要的作用是用于存储有序的数据,这其实和第一种解决方案的思路又不谋而合了,但是它的效率非常高;
  2、JDK里面提供了红黑树的代码实现TreeMap和TreeSet;

 为什么要重新计算Hash值:
/** 
* String的hashCode()方法运算结果查看 
* @author  http://www.cnblogs.com/xrq730/ 

*/ 
public class StringHashCodeTest 

    public static void main(String[] args) 
    { 
        System.out.println("192.168.0.0:111的哈希值:" + "192.168.0.0:1111".hashCode()); 
        System.out.println("192.168.0.1:111的哈希值:" + "192.168.0.1:1111".hashCode()); 
        System.out.println("192.168.0.2:111的哈希值:" + "192.168.0.2:1111".hashCode()); 
        System.out.println("192.168.0.3:111的哈希值:" + "192.168.0.3:1111".hashCode()); 
        System.out.println("192.168.0.4:111的哈希值:" + "192.168.0.4:1111".hashCode()); 
    } 

  我们在做集群的时候,集群点的IP以这种连续的形式存在是很正常的。看一下运行结果为:
192.168.0.0:111的哈希值:1845870087 
192.168.0.1:111的哈希值:1874499238 
192.168.0.2:111的哈希值:1903128389 
192.168.0.3:111的哈希值:1931757540 
192.168.0.4:111的哈希值:1960386691 

-- MD5:
MD5加密算法的java实现- http://www.cnblogs.com/computer-lzy/archive/2011/04/28/2031649.html
MD5加密算法的java实现- http://blog.csdn.net/zidan_2011/article/details/7708557
MD5和RSA加密算法Java完成实现 http://download.csdn.net/detail/yanzi1225627/7382263 
  MD5即Message-Digest Algorithm 5(信息-摘要算法5),是一种用于产生数字签名的单项散列算法。MD5算法的作用是让大容量信息在用数字签名软件签私人密匙前被”压缩”成一种保密的格式,将一个任意长度的“字节串”通过一个不可逆的字符串变换算法变换成一个128bit的大整数.MD5为不可逆加密.
/** 
* MD5的算法在RFC1321 中定义 
* 在RFC 1321中,给出了Test suite用来检验你的实现是否正确: Hash32位
* MD5 ("") = d41d8cd98f00b204e9800998ecf8427e 
* MD5 ("a") = 0cc175b9c0f1b6a831c399e269772661 
* MD5 ("abc") = 900150983cd24fb0d6963f7d28e17f72 
* MD5 ("message digest") = f96b697d7cb7938d525a2f31aaf161d0 
* MD5 ("abcdefghijklmnopqrstuvwxyz") = c3fcd3d76192e4007dfb496cca67e13b 

* @author yilee 

* 传入:一个字节数组 
* 传出:字节数组的 MD5 结果字符串 
*/  
public class MD5 {  
    public static String getMD5(byte[] source) {  
        String s = null;  
        char hexDigits[] = { // 用来将字节转换成 16 进制表示的字符  
            '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};  
        try {  
            java.security.MessageDigest md = java.security.MessageDigest.getInstance("MD5");  
            md.update(source);  
            byte tmp[] = md.digest();          // MD5 的计算结果是一个 128 位的长整数,  
            // 用字节表示就是 16 个字节  
            char str[] = new char[16 * 2];    // 每个字节用 16 进制表示的话,使用两个字符,  
            // 所以表示成 16 进制需要 32 个字符  
            int k = 0;                        // 表示转换结果中对应的字符位置  
            for (int i = 0; i < 16; i++) {    // 从第一个字节开始,对 MD5 的每一个字节  
                // 转换成 16 进制字符的转换  
                byte byte0 = tmp[i];  // 取第 i 个字节  
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];  // 取字节中高 4 位的数字转换,  
                // >>> 为逻辑右移,将符号位一起右移  
                str[k++] = hexDigits[byte0 & 0xf];   // 取字节中低 4 位的数字转换  
            }  
            s = new String(str);  // 换后的结果转换为字符串  
   
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
        return s;  
    }  
}  
 
   消息摘要采用单向Hash 函数将需加密的明文"摘要"成一串128bit的密文,这一串密文亦称为数字指纹(Finger Print),它有固定的长度,且不同的明文摘要成密文,其结果总是不同的,而同样的明文其摘要必定一致。
目前广泛使用的算法有MD4、MD5、SHA-1
public class MessageDigestTest{
 public static void main(String[] args) throws Exception{
  String str="123";
  byte[] plainText=str.getBytes("UTF8");
  //使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法
  MessageDigest messageDigest=MessageDigest.getInstance("SHA-1");
  System.out.println("/n"+messageDigest.getProvider().getInfo());
  //开始使用算法
  messageDigest.update(plainText);
  System.out.println("/nDigest:");
  //输出算法运算结果
  System.out.println(new String(messageDigest.digest(),"UTF8"));
 }

-----------  国密算法   -----------------

> 国密算法:SSF33、SM1(SCB2)、SM2、SM3、SM4、SM7、SM9

完整的加密传输方式:通过RSA交换密钥,使用AES进行加密处理。

  国家商用密码管理办公室制定了一系列密码标准,包括SSF33、SM1(SCB2)、SM2、SM3、SM4、SM7、SM9、祖冲之密码算法那等等。

1. 其中SSF33、SM1、SM4、SM7、祖冲之密码是对称算法

2. SM2、SM9是非对称算法

3. SM3是哈希算法

SM2非对称算法加解密- http://blog.csdn.net/kimwu/article/details/14453569
浅谈几种常见商用国密算法芯片-- https://www.douban.com/note/513154909/
国密SM2非对称算法与实现-- http://blog.csdn.net/goldboar/article/details/7004867
国密算法(SM2,SM3,SM4)完善与算法辅助工具开发-- http://blog.csdn.net/goldboar/article/details/8673981
国密SM2算法基于Openssl实现-- http://download.csdn.net/detail/goldboar/3833072  
【国密算法那点事儿】解读DES和SM4、RSA和SM2及SM3--http://blog.csdn.net/slj_win/article/details/50546519

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值