² [ 得到密钥产生器]KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA", "SUN");
² [ 初始化密钥产生器] SecureRandom random = SecureRandom.getInstance("SHA1PRNG", "SUN"); keyGen.initialize(1024, random);
² [产生公钥和密钥] KeyPair pair = keyGen.generateKeyPair();PrivateKey priv = pair.getPrivate(); PublicKey pub = pair.getPublic();
² [ 得到一个签名对象] Signature dsa = Signature.getInstance("SHA1withDSA", "SUN");
² [初始化签名对象] dsa.initSign(priv);
² [对数据签名 ] dsa.update(buffer, 0, len);
² [得到签名的数据] byte[] realSig = dsa.sign();
² 签名结果直接按字节流存储
² 公钥通过pub.getEncoded(); 先转换为字节流来处理
² 先从文件中读到字节流中 à encKey
² [构造一个密钥说明类] X509EncodedKeySpec pubKeySpec = new X509EncodedKeySpec(encKey);
² [构造一个密钥管理器] KeyFactory keyFactory = KeyFactory.getInstance("DSA", "SUN");
² [取得公钥] PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
² [ 同生成签名一样先取得签名对象]
² [用公钥初始化签名对象] sig.initVerify(pubKey);
² [取得被签名的数据] sig.update(buffer, 0, len);
² [验证] boolean verifies = sig.verify(sigToVerify);
Policy
在 java.security.acl 还提供了支持访问控制的接口
前段时间我用 java 实现了课程中几个重要的算法 : 加密的 des 算法, 通过大数类的支持实现了 RSA 算法 , MD5 函数及带密码的签名算法, 但由于我还没有找到比较好的 Java 处理字节流的方法,所以接口不是很清晰,特别是用了大数类,使得网上的数据传输比较麻烦, 而目前我又没办法找到 java 对 RSA 和 加密算法的支持代码 [ 可以从网上的 JCE 部分找到 ], 这部分就使用了我编的算法, 加上时间关系我不能实现用x.509 标准来表示公钥等,所以系统的设计不是很流畅,权当是课后的一次练习。
< 由于钱目前不能通过 Internet 传输,这里认为客户端是一个管存取钱的代理 >
Client代理 向客户端提供的接口有:
0. Login ( [in] Uid , [in] password )
1. UpdateBalance([ in ] AccountNumber , [ int ] AccountHolder ,[ in ] AccountBalance ,[out] errInfo)
存/取操作。BankServer 确认用户帐号和用户后更改用户的存款数目。
2. CloseAccount([ in ] AccountNumber , [ int ] AccountHolder ,[ in ] AccountBalance )
消户。BankServer 确认用户帐号和用户后将户头取消。
² 由于要求在流览器中实现,在本地存取证书的方式是不可行的,对于用户身份认证还是采取了传统的 uid + PWD 的形式,但为了保密,在上传时先用银行的公钥用 RSA 算法加密 [ 该信息直接放在 Applet 的参数中 ]
² 由于没有证书管理措施,不妨认为用户是先执有效证件到银行开户以后取得帐号,设置了密码。用户在每次连接前先生成自己的一份证书,在Log in 时将公钥用x.509的格式[ java 类支持]上传给银行, 由于我自己的算法没法和java 类兼容,所以会话密钥用我自己的方式再上传给银行
² 银行每次确认连接后保留收到的用户的公钥证书。
² 用户形成命令后,先签名然后用约定的会话密钥对数据进行加密。
² 银行收到数据后,先用会话密钥解密,然后检查数据签名,对返回结果用会话密钥加密。