2015年4月21日星期二

为Xamarin更好的开发而改写的库 - y-z-f

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
为Xamarin更好的开发而改写的库 - y-z-f  阅读原文»

本人现今一直奋战在Xamarin.Android,可能有人会疑惑Xamarin本身就是跨平台的,为什么不能直接跨IOS和Android,这个当然是最后的目标,只是现今你连Android都不能拿出符合商业的项目谈何通吃?

而本人在实际开发中遇到了很多非常实际的需求,仅仅依靠Xamarin提供的库是完成完成的,开始作者开始bind各种库,但是从事过的人都知道这个bind就是一个揪心的过程,可能要面对几百个错误,然后去修正。如果是应付一次性开发的项目还好,但是面对从事运营的项目来说,这样无非是给自己埋下了一个定时炸药。因为一旦这样做,以后你需要修改的话,就需要修改java的源码,然后重新bind。所以后来作者就开始直接将java的库改写成c#的版本,这样在开发的时候直接引用项目,需要修改了直接修改,就避免了之前繁琐的过程,当然这个路程还很长,所以作者给出一些已经完成库,希望更多的人参与进来,能够完善这些库,甚至将这些库开发为可以跨平台的库。

1.VolleyCSharp

相信很多从事过java开发的人一定熟知这个库,在本人不断的改写中也感受到了这个库的强大之处,当然这个库还没有完全的实现原版的所有功能,主要是没有提供图片的请求,其他的请求本人已经完成了。Github

2.AppMsg

一个可以替代Toast的漂亮提示库,具体大家可以看效果图Github

3.PullToRefresharp

是由一个大神开发下拉刷新,但是其中的列表不提供类似QQ的那种滑动菜单的功能,所以笔者将SwipeMenuListView这个开源的列表滑动菜单与这个下拉刷新合并了起来,关于下拉刷新的效果图我就不贴出了,直接贴出SwipeMenuListView的效果图Github

4. SlideDatetimePickerCSharp

相信大家也对付时间输入的时候特别揪心,作者也遇到过这个需求,采用的是弹窗的方式来让用户选择,但是这个方式会导致弹出的窗口很长,如果是小屏幕的手机下用户操作性特别不好,所以作者寻觅很久,找到了一个java下非常好的时间选择库,花了一整天的时间完成,并通过了云测试下面给出示例图Github

5. MaterialLoadingProgressbarCSharp

不用多说还是找到了一个很好的java下的库,然后改写的。当然这个库是作者今天上午才完成最后编码和本地测试的,现在已经开始云测试了,先给出示例图Github

到这里作者自己改写的库就这么多了,还有一些Bind的库,就不献丑了,大家可以到我的Github看看,如果有其他的大神希望一起来改写或者开发,可以加我的QQ:976691141。


本文链接:为Xamarin更好的开发而改写的库,转载请注明。

JDK中的证书生成和管理工具keytool - 京山游侠  阅读原文»

参考资料

  该文中的内容来源于 Oracle 的官方文档 Java SE Tools Reference 。Oracle 在 Java 方面的文档是非常完善的。对 Java 8 感兴趣的朋友,可以直接找到这个总入口 Java SE 8 Documentation ,想阅读什么就点什么。本博客不定期从 Oracle 官网搬砖。这里介绍的工具是 keytool

网络安全概论

  在 Web 世界里,安全是一个重之又重的课题,甚至是美国政府都禁止某些加密解密算法的出口。 Java 和 Linux 都是 Web 领域的领头羊,各种加解密的算法和管理工具一应俱全,例如 GnuPG 就是一个不错的安全套件。但是在这里,只展示一下 JDK 中的 keytool 工具的使用方法。

  先来说一下加解密算法的分类。基本上可以分为三类,它们分别是对称性解密算法、非对称性加密算法和消息摘要算法。每一类算法中又有多个不同的具体算法。对于这些算法,我们不要求完全掌握,但是对于各类算法的特点和用途是一定要了解的,对于一些常见的名字,如 DES、AES、RSA、DSA、MD5、SHA1 等,一定要熟悉,至少要知道它们分别属于哪类算法。

  对称性加密算法使用同一个密钥对信息进行加密和解密,其信息的安全性一部分取决于加密算法和密钥的长度,另一部分取决于密钥在传递过程中是否会被截获或盗取。非对称性加密算法使用两个密钥分别对信息进行加密和解密,这两个密钥称为私钥/公钥对。使用私钥加密的信息必须使用公钥解密,反之亦然。公钥可以公开发布,私钥由加密方保存,绝对不公开,将私钥被截获或窃取的可能性降到最低,因此非对称性加密算法的安全性比对称性加密算法的安全性更高。既然非对称性加密算法比对称性加密算法安全性更高,那对称性加密算法有什么存在的必要呢?这是因为对称性加密算法的运算速度更快。现实中,往往将对称性加密算法和非对称性加密算法结合使用,对于要传输的大块数据使用对称性加密算法加密,然后对加密使用的密钥使用非对称性加密算法进行加密,这样既可以获得更高的安全性,又可以获得更高的加解密运算速度。常用的对称性加密算法有DES算法、AES算法、3DES算法、TDEA算法、Blowfish算法、RC5算法、IDEA算法。常用的非对称性加密算法有DSA算法、RSA算法、Elgamal算法、背包算法、Rabin算法、D-H算法、ECC算法(椭圆曲线加密算法)。

  消息摘要算法的主要目的是对数据生成摘要。消息摘要算法不需要密钥,只有输入相同的数据才能得到相同的摘要,而且不可能从摘要反过来推算出数据。常用的消息摘要算法有MD5算法和SHA-1算法及其大量的变体。它们可以用来保证数据的完整性,在网络上发布文件时,常同时提供该文件的MD5值就是利用的消息摘要算法的这个特点,一旦该文件被篡改或者在网络传输中出现数据错误,再对其进行摘要运算就得不到相同的MD5值。

  对数据进行签名是我们在网络中最常见的安全操作。签名有双重作用,作用一就是保证数据的完整性,证明数据并非伪造,而且在传输的过程中没有被篡改,作用二就是防止数据的发布者否认其发布了该数据。签名同时使用了非对称性加密算法和消息摘要算法,对一块数据签名时,会先对这块数据进行消息摘要运算生成一个摘要,然后对该摘要使用发布者的私钥进行加密。接收者接受这块数据后,先使用发布者的公钥进行解密得到原数据的摘要,再对接收到的数据计算摘要,如果两个摘要相同,则说明数据没有被篡改。同时,因为发布者的私钥是不公开的,只要接收者通过发布者的公钥能成功对数据进行解密,就说明该数据一定来源于该发布者,他再怎么抵赖也没有用。

  那么问题来了,怎么确定某公钥一定是属于某发布者的呢?这就需要证书了。证书由权威认证机构颁发,其内容包含证书所有者的标识和它的公钥,并由权威认证机构使用它的私钥进行签名。信息的发布者通过在网络上发布证书来公开它的公钥,该证书由权威认证机构进行签名,认证机构也是通过发布它的证书来公开该机构的公钥,认证机构的证书由更权威的认证机构进行签名,这样就形成了证书链。证书链最顶端的证书称为根证书,根证书就只有自签名了。总之,要对网络上传播的内容进行签名和认证,就一定会用到证书。关于证书遵循的标准,最流行的是 X.509,关于证书的具体内容,网络上一搜一大把,我这里就不讲了。

使用keytool创建和管理证书

  在 Java 中也广泛使用证书,例如,使用 jarsigner 命令对 jar 包进行签名和认证。JDK 中创建和管理证书的工具是 keytoolkeytool 是一个功能强大的安全工具,它不仅仅只是用来创建和管理证书,还可以用来创建和管理对称性加密算法需要用到的密钥,还可以用自己的证书给别人签发证书(类似 CA 的工作),还可以导入别人发布的证书。 keytool 使用 keystore 存储密钥和证书,在一个 keystore 中可以存储多个条目,访问 keystore 和访问 keystore 中的条目均需要密码。

  下面开始实战。要进行非对称性加密,我们首先要有属于自己的私钥/公钥对,这可以通过 keytool -genkeypairs -alias xxx 命令得到。创建密钥对的时候, keytool 会在 keystore 中生成一个新的条目, -alias xxx 选项就是对该条目进行命名。生成密钥对之后,私钥是以原始数据直接储存在 keystore 中的,而公钥是要发布出去的,所以它被封装在一个 X.509 格式的自签名证书中。换句话说,创建密钥对的时候,同时就创建了一个自签名的证书。

  先将自己假想为一个认证机构,或者说一个只对我自己签发证书的私有认证机构,我称之为 MyCA,先为 MyCA 生成一个自签名的根证书,使用的命令是 keytool -genkeypair -alias MyCA ,如下图:

  可以看到,除了提示我们输入 keystore 的密码和 MyCA 条目的密码之外,还提示我们输入名字、部门、组织、区域、国家代码等信息,这些信息主要是用来标识证书的所有者。按提示完成操作后,就在 keystore 中生成了一个 MyCA 条目,该条目中保存有 MyCA 的私钥和 MyCA 的自签名证书,该证书中包含 MyCA 的公钥。使用 keytool -list 命令看一下,可以看到 keystore 中新增的 MyCA 条目。

  如果给 keytool -list 命令增加 -v 选项,则可以看到更加详细的内容。这些内容可以让我们对 MyCA 的证书有更直观的了解,如下图:

  然后,再为我自己生成一个密钥对,使用命令 keytool -genkeypair -alias youxia 命令,按提示完成操作后,keystore 中就又多了一个 youxia 条目,如下图:

  使用 keytool -list -v -alias youxia 命令可以查看 youxia 的证书,它也是自签名的,如下图:

  自签名的证书可以使用,但是总不如认证机构颁发的证书权威。怎么样让 CA 为我们颁发证书呢?首先我们要向 CA 提交申请,提交申请的时候需要提交一份称为 certificate request 的数据。我们可以通过 keytool -certreq 命令针对 keystore 中相应的条目生成该数据。在这里,我想让 CA 给 youxia 颁发证书,则使用 keytool -certreq -alias youxia 来生成 certificate request,我同时使用管道和 tee 命令让生成的数据既显示在控制台中,又保存在文件 youxia.certreq 中,如下图:

  从上图中可以看到,生成的 certificate request 数据是 Base64 编码的。然后,将该申请提交给 CA。当然,现实中的 CA 那都是要收费的,而且还不便宜。那么我只好自己提交给自己了,使用私有的 MyCA 来给 youxia 颁发证书。使用的命令为 keytool -gencert -alias MyCA -infile youxia.certreq -outfile youxia.cer,文件 youxia.cer 就是由 MyCA 颁发的证书。使用 keytool -printcert -v -file youxia.cer 命令可以查看该证书。

  然后,申请者收到 CA 颁发的证书后,可以使用 keytool -importcert -alias youxia -file youxia.cer 将证书导入到 keystore 中。导入证书后,再使用 keytool -list -v -alias youxia 查看,会看到完整的证书链,如下图:

  作为管理工具,keytool 当然提供导出证书的功能,使用 keytool -exportcert 命令即可。至此,我们已经完全了解了生成密钥对和证书的完整流程。关于 keytool 更详细的参数,请大家自己查看 keytool 的文档吧。

总结

  keytool 的使用方法很简单,重要的也就是 keytool -genkeypairkeytool -gencertkeytool -certreq 等命令,看到这些命令基本上就可以想到它们的功能。让人稍稍有点疑惑的是, keytool -genkeypair 不仅仅是生成密钥对,它会同时对公钥进行包装生成自签名的证书, keytool -gencert 并不是凭空生成证书,而是对 certificate request 进行回复。理解这两点,使用 keytool 就畅通无阻了。

(京山游侠于2015-04-22发布于博客园,转载请注明出处。)


本文链接:JDK中的证书生成和管理工具keytool,转载请注明。

阅读更多内容

没有评论:

发表评论