就下RSA算法对用户密码进行加密。三、对如加密及不对如加密。

/** 
     * 生成公钥和私钥 
     * @throws NoSuchAlgorithmException  
     * 
     */  
    public static HashMap<String, Object> getKeys() throws NoSuchAlgorithmException{  
        HashMap<String, Object> map = new HashMap<String, Object>();  
        KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");  
        keyPairGen.initialize(1024);  
        KeyPair keyPair = keyPairGen.generateKeyPair();  
        RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();  
        RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();  
        map.put("public", publicKey);  
        map.put("private", privateKey);  
        return map;  
    } 

    /** 
     * 使用模和指数生成RSA公钥 
     * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA 
     * /None/NoPadding】 
     *  
     * @param modulus 
     *            模 
     * @param exponent 
     *            指数 
     * @return 
     */  
    public static RSAPublicKey getPublicKey(String modulus, String exponent) {  
        try {  
            BigInteger b1 = new BigInteger(modulus);  
            BigInteger b2 = new BigInteger(exponent);  
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
            RSAPublicKeySpec keySpec = new RSAPublicKeySpec(b1, b2);  
            return (RSAPublicKey) keyFactory.generatePublic(keySpec);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  

    /** 
     * 使用模和指数生成RSA私钥 
     * 注意:【此代码用了默认补位方式,为RSA/None/PKCS1Padding,不同JDK默认的补位方式可能不同,如Android默认是RSA 
     * /None/NoPadding】 
     *  
     * @param modulus 
     *            模 
     * @param exponent 
     *            指数 
     * @return 
     */  
    public static RSAPrivateKey getPrivateKey(String modulus, String exponent) {  
        try {  
            BigInteger b1 = new BigInteger(modulus);  
            BigInteger b2 = new BigInteger(exponent);  
            KeyFactory keyFactory = KeyFactory.getInstance("RSA");  
            RSAPrivateKeySpec keySpec = new RSAPrivateKeySpec(b1, b2);  
            return (RSAPrivateKey) keyFactory.generatePrivate(keySpec);  
        } catch (Exception e) {  
            e.printStackTrace();  
            return null;  
        }  
    }  

    /** 
     * 公钥加密 
     *  
     * @param data 
     * @param publicKey 
     * @return 
     * @throws Exception 
     */  
    public static String encryptByPublicKey(String data, RSAPublicKey publicKey)  
            throws Exception {  
        Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");  
        cipher.init(Cipher.ENCRYPT_MODE, publicKey);  
        // 模长  
        int key_len = publicKey.getModulus().bitLength() / 8;  
        // 加密数据长度 <= 模长-11  
        String[] datas = splitString(data, key_len - 11);  
        String mi = "";  
        //如果明文长度大于模长-11则要分组加密  
        for (String s : datas) {  
            mi += bcd2Str(cipher.doFinal(s.getBytes()));  
        }  
        return mi;  
    }  

    /** 
     * 私钥解密 
     *  
     * @param data 
     * @param privateKey 
     * @return 
     * @throws Exception 
     */  
    public static String decryptByPrivateKey(String data, RSAPrivateKey privateKey)  
            throws Exception {  
        Cipher cipher = Cipher.getInstance("RSA/ECB/NoPadding");  
        cipher.init(Cipher.DECRYPT_MODE, privateKey);  
        //模长  
        int key_len = privateKey.getModulus().bitLength() / 8;  
        byte[] bytes = data.getBytes();  
        byte[] bcd = ASCII_To_BCD(bytes, bytes.length);  
        System.err.println(bcd.length);  
        //如果密文长度大于模长则要分组解密  
        String ming = "";  
        byte[][] arrays = splitArray(bcd, key_len);  
        for(byte[] arr : arrays){  
            ming += new String(cipher.doFinal(arr));  
        }  
        return ming;  
    } 

HTTPS

另外一样种方法是指向密码进行MD5加密,MD5是不可逆的,只能加密不克解密。但是其他人截取了密码的MD5字符串以后,可以原封不动的拿MD5加密后的字符串提交给服务器,服务器一定会判定这是毋庸置疑的密码,这样要得以登录上。

老三、对如加密以及未对如加密

3.
客户端接收到公钥以后,使用公钥对密码加密,然后将密文发给服务器;

3.3 HASH算法

  1. Hash算法特别之地方在它们是平等种植就为算法,用户可经Hash算法对目标信息充分成一段落特定长度的绝无仅有的Hash值,却不克通过之Hash值重新得到目标信息。因此Hash算法常用在不可恢复的密码存储、信息完整性校验等。
  2. 常见的Hash算法有MD2、MD4、MD5、HAVAL、SHA
                HashMap<String, Object> mymap = RSAUtils.getKeys();
                // 生成公钥和私钥  
                RSAPublicKey publicKey = (RSAPublicKey) mymap.get("public");  
                RSAPrivateKey privateKey = (RSAPrivateKey) mymap.get("private"); 
                // 模  
                String modulus = publicKey.getModulus().toString();  
                // 公钥指数  
                String public_exponent = publicKey.getPublicExponent().toString();  
                // 私钥指数  
                String private_exponent = privateKey.getPrivateExponent().toString(); 
                // 使用模和指数生成公钥和私钥  
                RSAPublicKey pubKey = RSAUtils.getPublicKey(modulus, public_exponent);  
                RSAPrivateKey priKey = RSAUtils.getPrivateKey(modulus, private_exponent);

一、加密

  1. HTTPS的通信过程中仅当拉手阶段采取了未对如加密,后面的通信过程
    均使用的是对准如加密,尽管不对如加密对待对如加密越来越安全,但为存个别单明明的先天不足:

    1. CPU的计算资源消耗大大,一软净TSL握手,密钥交换时之无对如解密计算量占全握手过程的90%以上,而对如加密之计算量只相当给未对如加密底0.1%,如果应用层数据吧采用未对称加解密,性能开销很可怜,无法经受;
    2. 非对如加密算法对加密的情节长度有限制,不克超越公钥长度,比如现在底常用之公钥长度是2048员,意味着需要加密内容无克跳256只字节;
    3. 因而公钥加密目前不得不用来开密钥交换或者内容签名,不适合当应用层传输内容的加解密
  2. HTTPS如何确保安全
    1. 服务器可以事先以不对如加密之公钥发给客户端,客户端就足以利用无对如加密的公钥加密对如加密的密钥了,然后以之密钥发给服务器,此时服务器就持有对如加密的公钥,双方即便足以通信了,所以无对如加密可以死好的管制针对性如加密的密钥,保证每次数据加密的密钥都未均等,这样的这客户端病毒拉取到通信的复苏存信息,也无能为力窃取到通信内容;
    2. 如若以通信过程被,在三不好握手或者客户端发起HTTP请求的历程遭到,客户端给中劫持,那么中人哪怕异常爱弄虚作假,和客户端与服务器通信,所以就算应运而生了数字证书,
    3. 服务器首先生成公私钥,把公钥提供于相关机关CA,CA将公钥放入数字证书并将数字证书颁布为服务器,此时服务器即可将数字证书给客户端,数字证书中不仅只有公钥还加入了片署机制,保证数字证书一定是服务器发给客户端的;
    4. 归结以上三沾:非对如加密算法(公钥和私钥)交换对称密钥+数字证书验证身份(也即是公钥是休是借用的)+利用对如加密加解密后传输数据信息

匪对如加密极其常用之尽管是RSA算法,RSA算法是由罗纳德·李维斯特(Ron
Rivest)、阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leonard
Adleman)一起提出的,取了她们姓的率先单字母来命名。RSA算法的原理就是非曰了。密钥长度为768的RSA算法有或受破解,密钥长度也1024底RSA算法还没吃破解,所以可以认为密钥长度也1024之RSA算法是较安全的。但是RSA算法的计算量大,一般才用于重大信息的加密,如密码、对如加密算法的密钥等。在我们的品种中,就采用RSA算法对用户密码进行加密。具体的步骤如下:

2.1 TSL/SSL定义
  1. SSL(Secure Socket
    Layer,安全宪章接字层),位于可靠的面向连接的网络层协议及应用层协议中的同栽协议层。SSL通过互动印证、使用数字签名确保完整性、使用加密担保私密性,以贯彻客户端和服务器之间的安通讯。该协议由简单交汇结:SSL记录协议及SSL握手协议。
  2. TLS:(Transport Layer
    Security,传输层安全磋商),用于两个应用程序之间提供保密性和数据完整性。该协议由少重叠结:TLS记录协议及TLS握手协议。

近来召开的一个门类,服务器也Java,采用SSH框架,客户端为Android和IOS。当用户登录时,从客户端向服务器交由用户称与密码。这虽在一个题材,如果数量包在网及受其他人截取了,密码便来或泄露。

3.1 对如加密

  1. 本着如加密:加密暨解密使用相同的密钥的算法,它要求发送方和接收方通信前订一个对称密钥,对称算法的安全性完全依靠让密钥;
  2. 对如加密分为两栽模式,流加密跟分组加密
  3. 流加密:将信息作为字节流对待,并且使用数学函数分别作用在各级一个字节位上。使用流加密时,每加密一破,相同之明白位会转换成为不同的密文位。流加密使用了心腹钥流生成器,它生成的字节流与明文字节流进行异或,从而生成密文。
  4. 分组加密:是拿消息划分为几个分组,这些分组随后会由此数学函数进行拍卖,每次一个分组;比较常用之分组加密算法有DES、3DES、AES。其中DES是于老的加密算法,现在都给证明不安全。而3DES是一个连片的加密算法,相当给在DES基础及进展三重新运算来提高安全性,但彼本质上或同DES算法一致。而AES是DES算法的替代算法,是今日极端安全之对称加密算法有。
  5. DES(Data Encryption
    Standard):数据加密标准,速度较快,适用于加密大量数目的场合。
  6. 3DES(Triple
    DES):是依据DES,对同样片数据用三个不等之密钥进行三不成加密,强度更强。
  7. AES(Advanced Encryption
    Standard):高级加密标准,是产时之加密算法标准,速度快,安全级别高;
  8. AES算法理解:AES
    算法基于排列和交换运算。排列是对准数据更展开布置,置换凡以一个多少单元替换为另外一个。AES
    使用几种不同的不二法门来实施排列和置换运算。AES
    是一个迭代的、对称密钥分组的密码,它好应用128、192 同 256
    位密钥,并且为此 128
    位(16字节)分组加密和解密数据。与集体密钥密码使用密钥对不同,对称密钥密码使用同一之密钥加密和解密数据。通过分组密码归的加密数据的位数和输入数据一致。迭代加密应用一个巡回结构,在拖欠循环中再度置换和替换输入数据
  9. 本着如加密的优点:计算量小,加密速度快,加密效率高
  10. 本着如加密底短处:
    1. 交易双方还施用同一密钥,安全性得无至保障
    2. 老是用对如加密算法时,都亟需用其他人不明了的唯一密钥,这让两岸所享有的密钥数量上几哪里级数增长,密钥管理变成负担;

脚是首要代码。

二、TSL/SSL

2.
服务器收到至客户端的报名后,生成有密钥,将公钥发给客户端,私钥自己保留;

2.3 TSL/SSL区别
  1. 新式版本的TLS(Transport Layer
    Security,传输层安全磋商)是IETF(Internet Engineering Task
    Force,Internet工程任务组)制定的平种植新的合计,它确立于SSL
    3.0磋商正式之上,是SSL
    3.0底接轨版本。在TLS与SSL3.0之间是正在强烈的差别,主要是它所支撑之加密算法不同,所以TLS与SSL3.0不能够互相操作。
  1. 客户端向服务器申请密钥;

3.2 非对如加密

  1. 未对如密钥交换算法本身非常复杂,密钥交换过程涉及到仍机数生成,模指数运算,空白补齐,加密,签名等,一密密麻麻及其复杂的进程;
  2. 官方的定义:公开密钥加密(英语:public-key
    cryptography,又译为公开密钥加密),也称非对如加密(asymmetric
    cryptography),一种密码学算法类型,在这种密码学方法吃,需要有的密钥(其实这里密钥说法不好,就是“钥”),一个凡私人密钥,另一个虽是公开密钥。这简单只密钥是数学相关,用有用户密钥加密后所得的信,只能用该用户的解密密钥才会解密。如果知道了其中一个,并无克计算起另外一个。因此只要公开了相同对准密钥中之一个,并无会见害及另外一个之私房性质。称公开之密钥为公钥;不明白之密钥为患得患失钥。
  3. 科普的莫对如加密算法:
    1. RSA:由 RSA
      公司表明,是一个支撑变长密钥的集体密钥算法,需要加密的文件块的长也是可变的;
    2. DSA(Digital Signature Algorithm):数字签名算法,是平等栽标准的
      DSS(数字签名标准);
    3. ECC(Elliptic Curves Cryptography):椭圆曲线密码编码学。

可使用Base64对密码编码,但是Base64要开展解码是生爱的从。

2.2 TSL/SSL运行过程
  1. 运作的长河:SSL/TSL协议使用的从事公钥加密法(也就是以的免对如加密,目前大部分下的凡RSA),客户端先为服务器需要公钥,然后使用公钥加密,服务器收到密文后动私钥解密
  2. 消到的公钥是运用的数字证书的法门,这个里面不仅包含了公钥而且投入了有的署名,保证了公钥的安康;而背后的诸一样不好会话客户端和服务器都颇成一个对话密钥来加密,此种植艺术是堆成加密大大下跌了运算量;
  3. SSL/TLS协议的中心历程是这么的:
    1. 客户端向劳动器端索要并说明公钥。
    2. 双方商谈生成”对话密钥”。
    3. 两头用”对话密钥”进行加密通信。

解决之计就不得不采用加密算法了。加密算法分为对如加密跟莫对如加密。对如加密算法,加密及解密使用同样之密钥,密钥在网传输的历程被生或为截取,所以未是很安全。非对如加密,使用公钥加密,只能采取私钥解密,公钥是公然之,私钥是无公开的。即使在传递的历程中,公钥被其他人获取了为无所谓,因为公钥是故来加密的,只有私钥才能够解密,而私钥是不见面传送的,也就是未容许为其他人获取。

四、HTTP与HTTPS的区别

  1. https需要交CA申请证书,一般免费证书很少还用交费;
  2. http是超文本传输协议,信息是坐明传输,https是负有
    安全性的ssl/tls加密的传协议;
  3. http和https使用的是意两样之连日方式,且默认的连年端口也是未均等的,http默认80,https默认443;
  4. http的连续老简短,是无论状态的,https协议是出于ssl+http协议构建的而进行加密传输,身份验证的网络协议,比http协议安全;

服务器收到客户端的请求时,生成有密钥:

别密钥和加密、解密的代码:

用中的模和私钥指数发给客户端,客户端收到后,使用getPublicKey(String
modulus, String
exponent)生成公钥,使用公钥对密码加密,然后发给服务器。服务器收到密文以后,使用decryptByPrivateKey(String
data, RSAPrivateKey
privateKey)解密,获得密码明文,然后便好看清密码是否正确。

4.
服务器收到至密文以后,使用私钥解密,判断是否是是的密码。

相关文章