月度归档: 2015 年 6 月

  • JavaScript RSA 非对称加密

    使用 JSEncrypt 完成 JavaScript 非对称加密。

    假定整个加解密过程中使用的密钥如下。

    公钥:

    -----BEGIN PUBLIC KEY-----
    MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC5A/TPEmOQYgT2po11qvjeBUPE
    dqUEz1Z7MeHH7KI2p74pYK8RsvYngy1cH/wnMXmsf+Wb3tmlqNGa7atW8wlpSfXX
    QV9bFECPEVRnESo8xtN7ZAlJFcdRvBVgfVwC3m9HWpVvKnd9NREXIcg5NHh57q7u
    lsGCZJ2VOJm9EIgFEwIDAQAB
    -----END PUBLIC KEY-----
    

    私钥:

    -----BEGIN RSA PRIVATE KEY-----
    MIICXQIBAAKBgQC5A/TPEmOQYgT2po11qvjeBUPEdqUEz1Z7MeHH7KI2p74pYK8R
    svYngy1cH/wnMXmsf+Wb3tmlqNGa7atW8wlpSfXXQV9bFECPEVRnESo8xtN7ZAlJ
    FcdRvBVgfVwC3m9HWpVvKnd9NREXIcg5NHh57q7ulsGCZJ2VOJm9EIgFEwIDAQAB
    AoGBALcfBVVXHBiyC7udSfInET+e8l4oGFjUZwJ0csaQnlV+XadSvLTF7wFYwrKm
    LcsVGxrzU+2c+ssOdrfjeW0MDEjrbd1xtmayP8Kh2/Pg+9jZqj188tTlLwzUW6iz
    KDEpiG5P1f1cbKY+R/BHQIKt7vcd2QMNVctxSkjl1uSvU/ERAkEA7uCuAJsVgmui
    NjDscoXyj+QRFWqDnUNCZqSqjYw7/BC36xYg/Xolw/bqg9aTgua96fv9k9hExOBY
    eNV3mj63bwJBAMZG7J5/vc3bkVwOS3A5E8j4hwCIFDylbKQ8chdulC3wwDLaSRdE
    evUfhAmMev1cc4QiVaXzGKPcS9ko8Gdz2p0CQAftfvjYLMOSTOTdhMtcNKuf1w1N
    5qZOeCKt7lcaQ1dfOqtbpaaj6iLxy+CqO2UJwV3FlinU8JtUEruX4gtFb5MCQGgb
    l2RFuHhdgH5wdwXOwme0rtYFnXKWfWvi3RkWk7FnhtNssBIKf/EzAhYtb+qWX4US
    rhv7f4WSRzUX/NqlBzUCQQCfDpC5/DZ/7RMKbDj7inW2G/3T56jzCdicIAgN0erZ
    jcbB7+8VQLjcw5LFYPwgjjz5v6Amw42VY+dBUNWVEH9C
    -----END RSA PRIVATE KEY-----

    JSEncrypt 使用私钥加密示例:

    // 创建 RSA 对象
    var crypt = new JSEncrypt();
    
    // 私钥
    var private_key = "-----BEGIN RSA PRIVATE KEY-----...";
    
    crypt.setPrivateKey(private_key);
    
    var encrypted = crypt.encrypt('123456');
    

    得到结果:

    bC8nemetJfmenSldUccrHcY+aMVBO1ANYJky42vKhv+8iMmecAmDSalOj/065+AZBRhsWuT0C26A5IJTnI9COpA3L1xV54Mwz8j3Y0DdGRqaAFH+lkibVj/JOsTYfKVWnPMwc0D/EL2IJdi18sct2s3CvGxp7+1sRayKSoPvTa8=

    RSA 加密得到的密文每次都不一样, 因为加入了随机数。

    JSEncrypt 使用公钥解密示例:

    var crypt = new JSEncrypt();
    var private_key = "-----BEGIN RSA PRIVATE KEY-----...";
    
    crypt.setPrivateKey(private_key);
    
    var decrypted = crypt.decrypt('123456');
    

    PHP 使用私钥加密示例:

    openssl_pkey_new(array('private_key_bits' => 1024));
    

    PHP 使用公钥加密示例:

    openssl_pkey_new(array('private_key_bits' => 1024));
    

    JSEncrypt 同时支持自动创建公钥和私钥:

    // 支持 512、1024、2048、4096
    // key 越长, 生成密钥和加密时间越长
    var crypt = new JSEncrypt({default_key_size: 1024});
    
    // 获取公钥
    var public_key = crypt.getPublicKey();
    
    // 获取私钥
    var private_key = crypt.getPrivateKey();
    

    利用 JSEncrypt 可以完成在前端网页对密码等敏感信息进行加密,传输到服务器端再进行解密。

    JSEncrypt 项目地址:https://github.com/travist/jsencrypt

    在 JSEncrypt 基础上实现的在线工具 —— RSA 加密解密

  • JavaScript 箭头函数 —— Arrow Function

    Arrow Function 是 ECMAScript6 中的新特性。

    先看两个酷炫的箭头函数示例:

    var a1 = [
    	"Hydrogen",
    	"Helium",
    	"Lithium",
    	"Beryl­lium"
    ];
    
    var a2 = a1.map(function(i){ return i.length });
    
    var a3 = a1.map( i => i.length );
    

    更炫

    var b1 = [4, 3, 2, 1];
    
    var b2 = b1.sort(function(i, j){ return i > j });
    
    var b3 = b1.sort((i, j) => i > j);
    

    在最新版的 Firefox 中可以体验这种特性。

    Arrow Function map

    Arrow Function sort