基于DES算法的银行系统安全登录设计


    基于DES算法的银行系统安全登录设计 摘 要 随着信息与通信技术的迅猛发展和广泛应用,网络与信息系统基础性、全局性的作用日益增强, 人们通过互联网进行信息交流,难免涉及到用户登陆安全问题,这不仅关系到个人隐私甚至可能是国家机密,国家安全。银行系统旨在为员工提供信息管理、安全高效和操作方便的界面,建立一个沟通员工与管理员、员工与银行的服务系统。从这个意义上来说,采取对银行系统用户密码的有效加密、邮箱账号激活以及异地登陆提醒等措施,就是我们必须面对的问题。 本文对用户安全登陆进行了深入的研究,一方面,我们采用DES算法对密码进行加密及存储,会经过以下几个步骤:初始置换IP、DES算法子密钥的产生、DES算法的扩展置换、S盒置换、P盒置换以及末置换函数;第二方面,我们使用javaMail给用户的邮箱发送激活账号邮件,对于刚注册的账号,如果没有邮箱激活这一过程,用户将不能登陆系统;第三方面,系统自动匹配邮箱之前登陆的IP地址,当出现新的IP登陆时,则判断为陌生IP在异地登陆并且对于连续多次输入错吗密码次数进行登录限制。 DES存在弱密钥和补密钥的特征。在以前的密钥设计过程中,弱密钥是不可避免的,但用户被告诫尽量不要使用补密钥。因此本次毕设中使用补密钥的去实现加密和解密过程。 最终通过以上三个步骤,并且使用SSM框架,将整个系统划分为表现层,Controller层,Service层,Dao层四层,完成整个银行登录设计和系统功能的设计,保证了银行系统用户登陆的安全性。 关键词: DES; 登录; SSM; 安全 Abstract With the rapid development and wide application of information and communication technology, the basic and overall role of network and information system is increasing day by day. People communicate information through the Internet, which inevitably involves the security of user landing. This is not only related to personal privacy, but also possibly national secret and national security. The bank system aims to provide employees with information management, safe, efficient and easy to operate interface, and establish a service system to communicate with employees and managers, employees and banks. In this sense, we have to face the problem of effectively encrypting user passwords, activating mailbox accounts and reminding people to log on in different places. This paper makes a deep research on user's secure login. On the one hand, we use DES algorithm to encrypt and store passwords, which will go through the following steps: initial replacement IP, generation of DES algorithm sub-key, extended replacement of DES algorithm, S-box replacement, P-box replacement and last replacement function; on the other hand, we use Java Mail to send activation account email to users. For newly registered accounts, if there is no email activation process, users will not be able to login to the system; third, the system automatically matches the IP address before the mailbox login. When a new IP login occurs, it judges that the unfamiliar IP is landing in another place and restricts the number of times that the wrong password is entered repeatedly. DES has the characteristics of weak key and complementary key. In the past key design process, weak key is inevitable, but users are warned not to use complementary key as far as possible. Therefore, the complementary key is used to realize the encryption and decryption process. Finally, through the above three steps, and using the SSM framework, the whole system is divided into four layers: the performance layer, the controller layer, the service layer, and the DAO layer, to complete the design of the whole bank login design and system functions. It guarantees the security of user login in banking system. Key words:Data Encrytion Standard; landing; SSM; Security 目 录 1 绪论 1 1.1 研究背景 1 1.2 研究内容 2 1.3 本文结构 2 2 DES算法的特点及实现原理 3 2.1 DES算法的特点 3 2.2 DES算法的实现原理 3 2.2.1DES算法的基本结构 4 2.2.2DES算法初始置换函数IP 4 2.2.3DES算法子密钥Ki的产生 5 2.2.4DES算法的密码函数F 6 2.2.5DES算法的工作模式 9 3 系统功能的设计 11 3.1 注册功能的设计 11 3.2 登录功能的设计 12 3.3 其他功能的设计 12 4 系统实现 13 4.1数据库表的设计 13 4.2数据库操作接口 13 4.3实现注册功能 17 4.3.1注册页面的实现 17 4.3.2邮箱激活账号的实现 19 4.4实现登录功能 21 4.4.1登录页面的实现 21 4.4.2权限控制的实现 22 4.4.3异地登录提醒的实现 25 4.4.4限制登录错误次数的实现 26 4.5实现系统其他功能 27 4.5.1员工信息管理的实现 28 4.5.2理财管理和账目管理的实现 29 4.5.3账户信息管理的实现 29 5 总结 31 参考文献 32 致 谢 33 1 绪论 1.1 研究背景 网上银行是信息时代的产物。它的诞生,使原来必须到银行柜台办理业务的客户,可以直接通过互联网进入网上银行,进行相关业务的操作。银行管理系统的开通,对银行和客户来说,都将大大提高工作效率,让资金创造最高效益,从而降低生产经营成本。 银行管理系统是指网上银行的员工在终端设备上自己完成交易的业务服务系统。银行的绝大部分个人业务均可在银行管理系统上实现应用。由于银行的数据有大量集中等特点,设计一套安全、稳定、高效的银行管理系统具有非常重要的现实意义。 其中一个功能模块是所有这些系统必不可少的,那就是登录模块,登录模块负责生成、存储并验证用户身份的数据,在用户对系统进行操作的时候验明用户的真实身份,并进行权限控制。在本系统中,登录模块作为系统安全重要控制入口,在登录系统的时候,应该有关于注意安全等提示。因而从安全性考虑的系统应该有邮箱账号激活、密码加密、异地登陆提醒、限制登录错误次数等功能来保证用户的安全性。 曾经一段时间,国内外许多公司很少把安全和功能放在同等重要的位置,导致了许多安全事件的发生,这一点在国内尤为突出,大公司出现安全问题的新闻屡见不鲜。2017年10月,雅虎发布公告称,在2013年的数据泄露事件中,有大概30亿笔帐号(包含当时雅虎所有的用户)泄露,而不是之前所估计的10亿笔,数据泄露的影响范围远超过此前的估计。2017年11月,Uber主动公开了去年发生了一起严重的数据泄露事件,据悉,黑客通过外部代码托管网站GitHub获得了Uber在AWS上的账号和密码,从而盗取了5700万乘客的姓名、电子邮件和电话号码,以及约60万名美国司机的姓名和驾照号码。为了隐瞒此事件,Uber曾向黑客支付10万美元封口费。由此可见,需要我们制定准则来保证公司的安全。 国外目前不仅在密码基础理论方面的研究做的很好,而且在实际应用方面也做的非常好。制定了一系列的密码标准,特别规范。算法的征集和讨论都已经公开化,但密码技术作为一种关键技术,各国都不会放弃自主权和控制权,都在争夺霸权地位。美国征集DES的活动就充分体现了这一点,1977年,美国数据加密标准(Data Encryption Standard, DES)颁布,在此后的30年,DES成为世界范围内的标准,除此之外,公开密钥算法RSA同样发展迅速,相关算法的不断改进,和新方法,新思路的不断涌现,这些,对对称密码加密算法的深入研究都起到很大的作用。同时国内的所有银行系统都会涉及到安全登录问题,除了对密码加密,邮箱账号和异地登陆提醒也是必不可少的,安全人员也在致力于这方面的研究,并且投入大量的人力和财力来保障客户的财产安全。 总的说来PKI技术仍在发展中,按照国外一些调查公司的说法,PKI系统仅仅还是在做示范工程。IDC公司的Internet安全资深分析家认为:PKI技术将成为所有应用的计算基础结构的核心部件,包括那些越出传统网络界限的应用。B2B电子商务活动需要的认证、不可否认等只有 PKI产品才有能力提供这些功能。 1.2 研究内容 本文着重于解决DES算法在密码存储领域的重要应用,邮箱激活账号、异地登陆提醒以及限制登录错误次数等一系列登录时会出现的问题。 DES算法的安全性很大一部分是依赖于密钥的长度,但是DES的密钥长度却只有64位,所以即使使用穷举法在一定的条件下对密钥的攻击也是可以实现的,所以可以增加密钥的长度。DES算法中只用到64位密钥中的其中56位,在实际应用中,我们应避开使用第8,16,24,......64位作为有效数据位,而使用其它的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。所以在对本课题的研究过程中也有有意的避免使用第8,16,24,......64位。 邮箱激活的逻辑主要是用户在注册页面输入邮箱地址,后台生成一个激活码,将用户信息存储,并发送激活邮件,用户点击邮箱中的链接来激活。异地登陆提醒即是系统自动匹配邮箱之前登陆的IP地址,当出现新的IP登陆时,则判断为陌生IP在异地登陆。限制登录错误次数则是若已经错误登录5次,返回特定编码以告知前台显示错误信息。若次数不足5次,错误登录次数+1,并返回正常错误信息。 1.3 本文结构 第一章主要介绍了国内外公司关于安全防范的发展历程,银行系统的需求来源,登录模块的引出,DES算法的发展历程,简介了DES算法在密码存储领域的重要应用及邮箱激活账号、异地登陆提醒、限制登录错误次数在登录模块的应用。 第二章详细介绍了DES算法的特点及它的实现原理,从算法的基本结构到算法的子密钥产生,算法的迭代过程,算法的加密、解密过程都有了深入的阐述。 第三章介绍了系统功能的设计,从注册功能到登录功能再到系统的其他功能,他们的设计原理及注意事项。 第四章介绍了系统所需要的数据库表及数据库操作接口,以及如何实现注册、登陆和系统的其他功能,给出了核心代码。 第五章总结了整个模型框架及结果,总结了利用DES算法在密码存储这一块的优势和缺点。 2 DES算法的特点及实现原理 2.1 DES算法的特点 DES算法是一种最通用的对称密钥算法,属于分组密码算法。DES主要用于民用敏感信息的加密。DES算法为密码体制中的对称密码体制,又被称为美国数据加密标准,是1972年美国IBM公司研制的对称密码体制加密算法。 明文按64位进行分组,密钥长64位。对称密钥算法又分为两种:分组密码和流密码。分组密码将明文分割为若干个定长的数据块,称为一个分组,每次对一个分组进行处理;流密码又称序列密码,依次对输入每个元素进行处理。 基于密钥的算法的安全性在于其密钥的安全性,其算法本身是公开的。基于密钥的算法通常有两类:对称算法和公开密钥算法。对称算法又称为传统密钥算法。对称算法的对称性体现在加密密钥能够从解密密钥推算出来,反之也成立。在大多数对称算法中,加解密的密钥是相同的。可见,堆成密钥算法的加解密密钥都是保密的。而公开密钥算法的加密密钥是公开的,解密密钥是保密的。 DES算法具有极高安全性,到目前为止,除了用穷举搜索法对DES算法进行攻击外,还没有发现更有效的办法。而56位长的密钥的穷举空间为2^56,这意味着如果一台计算机的速度是每一秒钟检测一百万个密钥,则它搜索完全部密钥就需要将近2285年的时间,可见,这是难以实现的。然而,这并不等于说DES是不可破解的。而实际上,随着硬件技术和Internet的发展,其破解的可能性越来越大,而且,所需要的时间越来越少。使用经过特殊设计的硬件并行处理要几个小时。 2.2 DES算法的实现原理 DES的加密由四部分完成,分别为:初始置换函数IP,子密钥Ki及获取,密码函数F,末置换函数IP。算法的入口参数有三个:key、data、mode。key为加密解密使用的密钥,data为加密解密的数据,mode为其工作模式。DES作为一种基本结构为Feistel结构的加密算法,其加密核心在于F函数。而Feistel结构决定了其加密解密流程是相同的,无论是硬件实现还是软件实现都只需要一种结构,不需要分别实现。DES的分组长度为64位,初始置换函数IP接受长度为64位的明文输入,末置换函数IP输出为64位的密文,在子密钥的获取过程中,通过密钥置换获取从K1到K16共16个子密钥,这16个子密钥分别顺序应用于密码函数的16次完全相同的迭代运算中。DES的解密算法和加密算法完全相同,只需要将密钥的应用次序和加密时相反应用即可。即解密过程是初始置换函数IP接受长度为64比特密文的输入,将16个子密钥按照K16到K1的顺序应用与函数F的16轮迭代运算中,然后将迭代的结果经由末置换函数IP得到64位明文输出。 2.2.1DES算法的基本结构 图2.1 DES算法的基本结构 2.2.2DES算法初始置换函数IP 64位的明文分组x首先经过一个初始置换函数IP进行置换运算,产生一个64位的输出x0,该输出被分成两个分别为32位的左半部分L0和右半部分R0,用于F函数的16轮迭代运算的首次迭代的初始输入。初始值换函数IP实际上就是一张8x8的迭代表,如图2.2所示。明文分组中的64位按照表中的规定重新进行排序,其排列顺序为从左到右,从上到下。按表所示,明文中的第58位被放置在x0的第1位,第50位放在第2位,依此类推。 图2.2初始置换函数IP 2.2.3DES算法子密钥Ki的产生 子密钥的获取主要通过置换和移位运算来实现。首先由于DES是16轮循环,所以需要由64bit的随机密钥Key生成16个子密钥Ki,Key共64bit,但是其每个字节的最后一位都用不到,所以先通过初始置换将64bit的密钥转换为56bit,按照8行8列从左到右从上到下的排列,其中每行的第8位用于奇偶校验。在DES加密算法中,子密钥获取过程中,DES经过一系列的置换和移位运算,得到K1和K16共16个子密钥,每个子密钥的长度为48位。其实现过程如下: 首先将输入的64位密钥去掉最后一列的8个校验位,然后用密钥置换函数PC-1对剩下的56位密钥进行置换,如图2.3所示。 图2.3密钥置换函数PC-1表 由图2.3所知,用户输入的64位密钥中,第8、16、24、32、40、48、56、64共8个校验位被去掉,剩余的56位按照图2.3所示摆放,第57位放在第1位,第49位放在第2位,第41位放在第3位,第33位放在第4位,第25位放在第5位,第17位放在第6位,第9位放在第7位。 经过PC-1置换后,将其置换的输出再分为前28位C0和后28位D0两部分,上一轮的置换得到的输出的两部分经过循环左移1位或者2位后,每轮按图2.4所示进行移位,然后将两部分合成56位,之后经过压缩置换PC-2后得到当前这轮置换的48位子密钥。置换压缩如图2.5所示。 图2.4子密钥循环左位移表 图2.5压缩置换PC-2 PC-2置换为压缩置换,即置换后的输出数据的位数要比置换前输入的次数要少,即某些位的数据在置换的过程中被去掉了,由图2.5可知,在压缩置换过程中,原来的7 行8列共58位数据被压缩成了8行6列的48位数据。在压缩置换过程中,第9、18、22、25、35、38、43、54共8位数据被丢掉。同时,将上一轮移位后得到的两部分再进行移位,作为下一个子密钥产生的PC-2置换的输入。经过16次循环左移和16次置换得到16个子密钥。 子密钥的产生主要代码如下: if(key != NULL){ memcpy(temp, key, 8); permute(temp, DesTransform, 56); memset(lkey, 0, 4); memset(rkey, 0, 4); for(i = 0; i < 28; i++) { set_bit(lkey, i, get_bit(temp, i)); set_bit(rkey, i, get_bit(temp, i+28)); } for(i = 0; i < 16; i++) { rol_bit(lkey, 28, DesSubkey[i]); rol_bit(rkey, 28, DesSubkey[i]); for(j = 0; j < 28; j++){ set_bit(subKey[i], j, get_bit(lkey, j)); set_bit(subKey[i], j+28, get_bit(rkey, j)); } permute(subKey[i], DesPermuted, 48); } } 2.2.4DES算法的密码函数F 密码函数F接受两个输入:32位的数据和48位的子密钥。函数F的运算过程为: 先将数据的右半部分Ri通过扩展置换E从32位扩展为48位。之所以称为扩展置换,是因为置换后的数据比置换前的数据的位数要多。扩展置换E通过将原2位数据中的某些位重复出现达到扩展的目的。其置换函数如2.6所示。扩展置换也称为选择函数,俗称E盒。 图2.6扩展置换 由图2.6所知,扩展置换通过将第32、1、2、4、5、8、9、12、13、16、17、20、21、24、25、28、29共19位分别放置在两个位置,从而将32位的数据扩展为48位。接着将扩展置换后的48位输出E与压缩置换后的48位密钥Ki作异或运算,将异或运算得到的48位结果数据分成8个6位块,将每一块通过对应的一个S盒产生一个4位的输出。每个S盒实际上是一张4行16列的置换表,值得注意的是,S盒的行列编号都是从0开始的,显然,需要8个S盒。 S盒接受6位的输出,经过置换输出4位的数据,其具体置换过程为:将6位输入中的第1位和第6位取出来形成一个2位的二进制数x,该数得出S盒的行数,然后将6位输入的中间4位构成另外一个二进制数y,该数为S盒的列数,然后查出S的x行y列所对应的整数,将该整数转换为一个4位的二进制数,即为S盒的输出。 将上面得到的8个6位数据的置换结果连在一起,形成一个32位的输出,输出结果再通过一个P盒置换产生一个32位的输出,P盒置换如图2.7所示。 图2.7 P盒置换 最后,P盒置换的结果与左半部分进行异或运算,然后将左右两半部分交换,之后进行下一轮的迭代,在完成相同的16轮运算后,将得到的两部分数据合在一起,在经过一个末置换函数IP-1即可得到64位的密文。末置换函数IP-1是初始置换IP的逆运算,如图2.8所示。 图2.8末置换函数IP-1 扩展置换、S盒置换、P盒置换的代码如下: memcpy(temp, data, 8); permute(temp, DesInitial, 64); memcpy(ldata, &temp[0], 4); memcpy(rdata, &temp[4], 4); for(i = 0; i<16; i++){ memcpy(exp_data, rdata, 4); permute(exp_data, DesExpansion, 48); if(type == ENCRYPT){ xor_bit(subKey[i], exp_data, exp_data, 48); } else{ xor_bit(subKey[15-i], exp_data, exp_data, 48); } for(j = 0, p = 0; j < 8; j++){//p从0~32 row = (get_bit(exp_data, j*6+0) * 2) + (get_bit(exp_data, j*6+5) * 1); col = (get_bit(exp_data, j*6+1) * 8) + (get_bit(exp_data, j*6+2) * 4) + (get_bit(exp_data, j*6+3)) * 2 + (get_bit(exp_data, j*6+4) * 1); value = (unsigned char)DesSbox[j][row][col]; for(k = 4; k < 8; k++){ set_bit(exp_data, p, get_bit(&value, k)); p++; } } permute(exp_data, DesPbox, 32); xor_bit(exp_data, ldata, exp_data, 32); memcpy(ldata, rdata, 4); memcpy(rdata, exp_data, 4); 末置换代码如下: memcpy(data, rdata, 4); memcpy(data + 4, ldata, 4); permute(data, DesFinal, 64); return; 2.2.5DES算法的工作模式 在实际应用中,DES是根据其加密算法所定义的明文分组的大小(64bits),将数据割成若干个64bits的加密区块,再以加密区块为单位,分别进行加密处理。根据数据加密时每个加密区块间的关联方式,可以分为4种加密模式,包括ECB,CBC,CFB及OFB。 1.电码本模式(ECB) ECB模式是DES加密的基本工作模式。在ECB模式下,每一个加密区块依次独立加密,产生独立的密文区块,每一加密区块的加密结果不受其他区块的影响。使用此种方式下,可以利用并行处理来加速加密解密运算,且在网络传输时任一区块有任何错误发生,也不会影响到其他区块传输的结果。这是该模式的优点。该模式的缺点是容易暴露明文的数据模式。 2. 密码分组链接模式(CBC) 在CBC模式下,第一个加密区块先与初始向量IV做异或运算,再进行加密。其他每个加密区块加密之前,必须与前一个加密区块的密文作一次异或运算,再进行加密。每一个区块的加密结果均会受到前面所有区块内容的影响,所以即使在明文中出现多次相同的明文,也会产生不同的密文。密文内容若遭剪贴、替换,或在网络传输过程中发生错误,则其后续的密文将被破坏,无法顺利解密还原,这是这一模式的的优点,也是缺点。在CBC模式下,加密作业无法利用并行处理来加速加密运算,但其解密运算可以利用并行处理来加速。 3.密文反馈方式(CFB) 在CFB模式下,可以将区块加密算法当作流密码加密器使用,流密码加密器可以按照实际上的需要,每次加密区块大小可以自订,每一个区块的明文与前一个区块加密后的密文做异或后成为密文。因此,每一个区块的加密结果受之前所有区块内容的影响,也会使得在明文中出现多次相同的明文均产生不同的密文。在此模式下,位了加密第一个区块,也必须选择一个初始向量,且此初始向量必须惟一,每次加密时必须不一样,也难以利用并行处理来加快加密作业。 4.输出反馈模式(OFB) OFB与CFB大致相同,都是每一个区块的明文与之前区块加密后的结果做异或后产生密文,不同的是之前区块加密后的结果为独立产生,每一个区块的加密结果不受之前所有密文区块的内容的影响,如果有区块在传输过程中遗失或发生错误,将不至于无法完全解密,在此模式下,为了加密第一个区块,必须设置一个初始向量,否则难以利用并行处理来加快加密作业。 3 系统功能的设计 3.1 注册功能的设计 注册是一个网站最基本的功能,其工作流程如下:客户端(即浏览器)向服务端发起request请求,服务端通过监听8080端口来接收请求,服务端接收请求后进行相关处理,服务端向客户端发response响应。客户端接收response响应,完成一次交互。在注册期间,我引入了邮箱激活账号的功能,其目的是用户在完成注册后,可以利用发送邮件进行验证用户输入邮箱的真实性,进行账户激活,保证后续的信息能通过邮件发送给用户。邮箱激活账号的工作原理是用户注册后随机生成一个uuid作为用户的标识,传递给用户然后作为路径参数。发送html的内容到用户注册的邮箱里,若用户点击后去往的页面提交username和password比对成功,则用户验证成功。在这里我使用我的QQ邮箱作为邮件发送者。 值得注意的是关于前端校验和后端校验,其实前端和后端都可以的进行简单的数据校验,但是要注意的是:前端可以没有表单校验的过程(当然有一些简单的数据校验更好),但是后端必须得有数据校验。主要原因是:前端的数据校验是很容易被绕过去的比如curl 命令可以绕过前端直接向后台发请求,我们不能过于依赖网页中的JS校验,必须得有后台的数据校验来确保数据的安全。实际开发中不能将密码直接传到数据库存储,数据库中应该存的是用户的密码加密后的数据,然后用户如果登录,服务端得到密码,将其加密后再和数据库中的信息做对比。总体的注册过程如下图所示: 图3.1注册顺序图 3.2 登录功能的设计 登录页面最重要的三部分是登录邮箱、密码与登入按钮 。用户分别输入邮箱、密码后点击登录按钮进行登录操作。前端部分要做的事主要是判断用户是否在以上两个部分输入了信息,接着判断邮箱的格式是否正确(前端也可不进行判断邮箱的格式,因为后端服务器也会判断一次)。当用户内容输入正确后,客户端会将用户所输入的内容传给服务器。服务器得到信息后会再一次判断信息的格式等是否符合要求,无误后将得到的信息与数据库中的信息作比较。如果在数据库中能找到邮箱和密码与传入信息相同,则服务器设置cookie并返回HTTP状态码200给客户端,前端得到登录成功的信息就跳转到登录成功的页面;如果不同则返回HTTP状态码401给客户端,让客户端提示用户邮箱与密码不匹配、登录失败。前端需要将用户写的登录信息拿到并传给数据库,并会做一些简单的数据校验。 在这里,如果用户不在经常使用的IP上登陆时,会提示你异地登录。异地登录提醒的作用在于,如果用户的个人信息被窃取,能在第一时间反馈给用户,用户能够及时的修改个人信息,来保证自己的信息不被窃取。这样做,极大地保障了用户信息的安全性。 在项目的登录模块中,经常会有连续N次输错密码后禁止登录的需求。都是在用户登陆时查询数据库表,一般user表中会有:是否禁用、最后一次登陆时间(到秒)、用户登陆错误次数。用户登陆时查询该用户数据,进行判断,若是正确,则更新是否禁用为可用、最后登陆时间、错误次数为0;若是登陆错误时,错误次数+1,若是错误次数=3,则更新是否禁用为禁用,并更新最后一次登陆时间。若是登陆时该用户数据中是否禁用为禁用,则判断最后一次登陆时间与当前登陆时间相比较,半小时后可以登陆,重复上面流程。 3.3 其他功能的设计 银行管理系统是指网上银行的员工在终端设备上自己完成交易的业务服务系统。银行的绝大部分个人业务均可在银行管理系统上实现应用。银行管理系统采用前端加后台的架构模式,前台员工登录后可进行查询、转账充值等相关操作;后台由管理员登录,进行相关信息的增、删、改、更新操作。系统利用B/S结构模式,从实际需求出发,在实现基本功能的同时,突破了局域网的限制,满足当前的Internet开放、互连、信心共享的新要求。员工可以随时随地通过浏览器访问本网站上的数据信息,对提高银行管理效率与及时保护员工的权益有很大的意义。此外,系统会有每一个功能模块的使用说明,如果还有疑问的话,员工可以在客户服务端向管理员提问,同时管理员进行及时回复。银行管理系统旨在为员工提供信息管理、安全高效和操作方便的界面,建立一个沟通员工与管理员、员工与银行的服务系统。 4 系统实现 4.1数据库表的设计 首先是用户表,用户表的属性包括一个用户表的主键用户ID,用户名,用户密码,姓名,年龄,权限,用户的邮箱地址,用户的IP地址属性。其中用户名,用户密码,电子邮箱地址,IP地址属性都可以作为唯一标识用户的身份,编码方式设置为UTF-8。为了避免数据库出现空数据,所有数据项都使用NOT NULL关键字修饰为非空,再使用DEFAULT关键字设置默认值。用户表包含的约束只有主键约束,主键为用户ID。值得注意的是用明文保存密码有很大的信息安全隐患。一般数据库里还存有用户的姓名、手机号、用户名等信息,一旦数据库发生泄漏,再加上用户的明文密码,攻击者就可以用用户名和密码去其他网站尝试登陆(因为往往用户会将多个网站的密码根据习惯设成一样的),一旦登陆成功,就会造成更严重的后果。具体实现代码如下: CREATE TABLE `yonghu` ( `id` int(11) NOT NULL AUTO_INCREMENT, `yonghuming` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `mima` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `xingming` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `nianling` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `quanxian` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL, `regisStatus` int(255) NULL DEFAULT 0 COMMENT '是否激活,1激活 0未激活', `code` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '激活码', `addr` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 30 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic; 4.2数据库操作接口 本设计采用的是B/S模式并且使用SSM框架,会分为两部分:数据库接口类,以及接口类对应的映射xml文件,所以需要导入相应的jar包,如图4.1、4.2所示;还需要我们配置 jdbc.properties文件,如图4.3所示,邮件配置文件,如图4.4所示。 图 4.1 mybatis-spring.jar包 图 4.2 mysql-connector-java.jar包 图 4.3 jdbc.properties配置文件 图 4.4 mail.properties配置文件 配置文件代码如下: <!--邮件配置--> <context:property-placeholder location=“classpath:/config/mail.properties“ ignore-unresolvable=“true“/> <!-- 引入jdbc配置文件 --> <context:property-placeholder location=“classpath:/config/jdbc.properties“ /> <context:annotation-config /> <context:component-scan base-package=“com.pulook“ /> <!--创建jdbc数据源 --> <bean id=“dataSource“ class=“org.apache.commons.dbcp.BasicDataSource“ destroy-method=“close“> <property name=“driverClassName“ value=“${jdbc.driver}“ /> <property name=“url“ value=“${jdbc.url}“ /> <property name=“username“ value=“${jdbc.username}“ /> <property name=“password“ value=“${jdbc.password}“ /> </bean> <!--配置邮件接口--> <bean id=“javaMailSender“ class=“org.springframework.mail.javamail.JavaMailSenderImpl“> <property name=“host“ value=“${mail.smtp.host}“/> <property name=“username“ value=“${mail.smtp.username}“/> <property name=“password“ value=“${mail.smtp.password}“/> <property name=“defaultEncoding“ value=“${mail.smtp.defaultEncoding}“/> <property name=“javaMailProperties“> <props> <prop key=“mail.smtp.auth“>${mail.smtp.auth}</prop> <prop key=“mail.smtp.timeout“>${mail.smtp.timeout}</prop> </props> </property> </bean> 接口类代码如下: public interface YonghuMapper { public void insert(Yonghu yonghu); public void delById(@Param(“id“) int id); public void updateById(Yonghu yonghu); public Yonghu checkCode(@Param(“code“) String code); public List<Yonghu> getYonghuByConditionAsc(Yonghu yonghu); public List<Yonghu> getYonghuByConditionDesc(Yonghu yonghu); public List<Yonghu> getYonghuByConditionOrder(Yonghu yonghu); public List<Yonghu> getYonghuByConditionOrderIds(Map<String,Object> params); public List<Yonghu> getYonghuByConditionOrderCols(Map<String,Object> params); public Yonghu getYonghuById( @Param(“id“) int id ); public int getByConditionForNum(Yonghu yonghu); public void insertBatch(List<Yonghu> list); } 映射文件代码如下: <mapper namespace=“com.pulook.bankSystem.dao.YonghuMapper“> <insert id=“insert“ parameterType=“com.pulook.bankSystem.model.Yonghu“> insert into yonghu(yonghuming,mima,xingming,nianling,quanxian,addr,regisStatus,code) values(#{yonghuming},#{mima},#{xingming},#{nianling},#{quanxian},#{addr},#{regisStatus},#{code}) </insert> <select id=“checkCode“ parameterType=“String“ resultType=“com.pulook.bankSystem.model.Yonghu“> select * from Yonghu where code = #{code,jdbcType=VARCHAR} </select> <update id=“updateById“ parameterType=“com.pulook.bankSystem.model.Yonghu“> update yonghu set id = id , code = #{code}, regisStatus = #{regisStatus} <select id=“getYonghuByConditionAsc“ parameterType=“com.pulook.bankSystem.model.Yonghu“ resultType=“com.pulook.bankSystem.model.Yonghu“> select * from Yonghu where 1 = 1 <select id=“getYonghuByConditionDesc“ parameterType=“com.pulook.bankSystem.model.Yonghu“ resultType=“com.pulook.bankSystem.model.Yonghu“> select * from Yonghu where 1 = 1 <select id=“getByConditionForNum“ parameterType=“com.pulook.bankSystem.model.Yonghu“ resultType=“int“> Select count(*) from Yonghu where 1 = 1 <select id=“getYonghuById“ parameterType=“com.pulook.bankSystem.model.Yonghu“ resultType=“com.pulook.bankSystem.model.Yonghu“> select * from Yonghu where id = #{id} <select id=“getYonghuByConditionOrder“ parameterType=“com.pulook.bankSystem.model.Yonghu“ resultType=“com.pulook.bankSystem.model.Yonghu“> Select * from Yonghu where 1 = 1 4.3实现注册功能 4.3.1注册页面的实现 1. 注册页面效果如图4.5。 图4.5注册页效果图 2. 注册页面表单提交部分代码如下: <!--start-login-form--> <div class=“main“> <!-- <div class=“login-head“> </div> --> <div class=“wrap“> <!-- <div class=“Regisration“> <div class=“Regisration-head“> <h2><span></span>Register</h2> </div> <form> <input type=“text“ value=“First Name“ onfocus=“this.value = '';“ onblur=“if (this.value == '') {this.value = 'First Name';}“ > <input type=“text“ value=“Last Name“ onfocus=“this.value = '';“ onblur=“if (this.value == '') {this.value = 'Last Name';}“ > <input type=“text“ value=“Email Address“ onfocus=“this.value = '';“ onblur=“if (this.value == '') {this.value = 'Email Address';}“ > <input type=“text“ value=“User Name“ onfocus=“this.value = '';“ onblur=“if (this.value == '') {this.value = 'User Name';}“ > <input type=“password“ value=“Password“ onfocus=“this.value = '';“ onblur=“if (this.value == '') {this.value = 'Password';}“ > <input type=“password“ value=“ Confirm Password“ onfocus=“this.value = '';“ onblur=“if (this.value == '') {this.value = ' Confirm Password';}“ > <div class=“Remember-me“> <div class=“p-container“> <label class=“checkbox“><input type=“checkbox“ name=“checkbox“ checked><i></i>I agree to the Terms and Conditions</label> <div class =“clear“></div> </div> <div class=“submit“> <input type=“submit“ onclick=“myFunction()“ value=“Sign Me Up >“ > </div> <div class=“clear“> </div> </div> </form> </div> --> <div class=“Login“> <div class=“Login-head“> <h3>银行信息管理注册</h3> </div> <form action=“denglu?“> <div class=“ticker“> <h4>用户名</h4> <input type=“email“ value=““ id=“yonghuming“ ><span> </span> <div class=“clear“> </div> </div> <div> <h4>密码</h4> <input type=“password“ value=““ id=“mima“ > <div class=“clear“> </div> </div> <div> <h4>确认密码</h4> <input type=“password“ value=““ id=“mima1“ > <div class=“clear“> </div> </div> <!-- <div class=“checkbox-grid“> <div class=“inline-group green“> <label class=“radio“><input type=“radio“ name=“radio-inline“><i> </i>Remember me</label> <div class=“clear“> </div> </div> </div> --> <div class=“submit-button“> <input type=“submit“ value=“去登陆 >“ > <input type=“submit“ value=“注册 >“ onclick=“ zhuce();return false;“> </div> <div class=“clear“> </div> </div> </form> </div> </div> <!--//End-login-form--> <!-- <div class =“copy-right“> 4.3.2邮箱激活账号的实现 用户注册后随机生成一个uuid作为用户的标识,传递给用户然后作为路径参数。发送html的内容到用户注册的邮箱里,若用户点击后去往的页面提交username和password比对成功,则用户验证成功。在这里我使用我的QQ邮箱作为邮件发送者。激活码是我们点击邮件链接之后根据激活码查询用户,如果存在说明一致,将用户状态修改为“1”激活,上面的激活码发送到用户注册邮箱,如图4.6所示,点击链接直接跳转到登录页面,具体实现代码如下: 图4.6收到激活码 String context = “<a href=\“http://localhost:8080/checkCode?code=“+code+“\“> 激活请点击:“+code+“</a>“; mailUtil.sendHtmlMail (yonghuming,subject,context); f = “注册成功,请查收邮件激活账号!“; } JSONObject j = new JSONObject(); try { j.accumulate(“f“, f); } catch (Exception e) { e.printStackTrace(); } return j.toString(); } //校验邮箱中的code激活账户,首先根据激活码code查询用户,之后再把状态修改为“1“。 public ModelAndView checkCode(String code){ Yonghu user = y.checkCode(code); System.out.println(user); //如果用户不等于null,把用户状态修改status=1 if (user !=null){ user.setRegisStatus(1); //把code验证码清空,已经不需要了 user.setCode(““); System.out.println(user); y.updateById(user); } ModelAndView model = new ModelAndView(“denglu“); return model; } public class MailUtil { @Autowired private JavaMailSender javaMailSender; private String MAIL_SENDER = “854947864@qq.com“; //邮件发送者 public void sendHtmlMail(String to,String subject,String content) { try { MimeMessage message = null; message = javaMailSender.createMimeMessage(); MimeMessageHelper helper = new MimeMessageHelper(message,true); helper.setFrom(MAIL_SENDER); helper.setSubject(subject); helper.setTo(to); helper.setText(content, true); javaMailSender.send(message); } catch (Exception e) { e.printStackTrace(); } } } 4.4实现登录功能 4.4.1登录页面的实现 1.登录实现效果如图4.7所示。 图 4.7 登录界面效果 2.登页面前端部分代码如下: <div class=“login“> <div class=“box png“> <div class=“logo png“></div> <div class=“input“> <div class=“log“> <div class=“name“> <label>用户名</label><input type=“text“ class=“text“ id=“yonghuming“ placeholder=“用户名“ name=“yonghuming“ tabindex=“1“> </div> <div class=“pwd“> <label>密 码</label><input type=“password“ class=“text“ id=“mima“ placeholder=“密码“ name=“mima“ tabindex=“2“> <input type=“button“ class=“submit“ tabindex=“3“ value=“登录“ onclick=“ testajax();return false;“> <div class=“check“></div> </div> <div class=“tip“></div> <div class=“air-balloon ab-1 png“></div> <div class=“air-balloon ab-2 png“></div> <div class=“footer“></div> </div> <script type=“text/javascript“ src=“res/denglu/js/jQuery.js“></script> <script type=“text/javascript“ src=“res/denglu/js/fun.base.js“></script> <script type=“text/javascript“ src=“res/denglu/js/script.js“></script> <!--[if IE 6]> <script src=“js/DD_belatedPNG.js“ type=“text/javascript“></script> <script>DD_belatedPNG.fix('.png')</script> <![endif]--> <div style=“text-align:center;margin:50px 0; font:normal 14px/24px 'MicroSoft YaHei';“> <p>还没帐号? <a href=“zhuceye?“ >去注册</a></p> </div> </body> </html> 4.4.2权限控制的实现 系统包含众多模块,要求能够通过权限管理,控制不同用户对模块的访问权限,而且需要控制到对某个模块的某个操作(增删改查)的级别。一般情况下,通过角色对用户进行统一授权,在某些特殊情况下,能够单独对用户进行授权。本次设计中,银行管理应具备的两个必备模块,员工模块和管理员模块。员工模块实现了员工操作自己名下账户相关业务的功能,包括账户管理、理财管理、客户服务等业务模块,基本实现了个人的相关业务。管理员模块实现了管理员对相关信息的更新及回复功能。 用户入口 前台 后台 用户登录模块 注册 管理员登录模块 用户操作模块 管理员操作模块 管理员入口 图4.8 权限控制流程 员工登录及管理员登录所显示的界面不一样,如下图4.9和4.10所示。 图4.9 员工登录界面 图4.10管理员登录界面 实现代码如下所示: <script type=“text/javascript“> function testajax () { var yonghuming=document.getElementById(“yonghuming“).value; var mima=document.getElementById(“mima“).value; $.ajax( { url:'/ydenglu',// 跳转到 action url:表示后面跟访问地址 data:{ yonghuming:yonghuming, mima:mima, text:'dsf' }, type:'post', cache:false, async:false, Success:function(data) { // var s = “登陆成功“; // 当请求成功之后,返回的数据就在这做处理,我现在只是做了一个简单的弹出。 var obj = JSON.parse(data); var u =“正确“ var qx=“管理员“ var yh=“用户“ var hy=“员工“ if (obj.f==u&&obj.q==yh){ window.location.href=“http://localhost:8080/zhuye?“; }else if (obj.f==u&&obj.q==qx || obj.f ==u && obj.q== hy) { window.location.href=“http://localhost:8080/zhuye?“; }else{ alert(obj.f); }; }, error : function() { alert(“异常!“); } }); } 4.4.3异地登录提醒的实现 通过调用360查询IP和地址的接口,得到请求方相应的IP和地址,通过解析JSON得到相应的IP和地址,然后与数据库存储的IP和地址比较,判断是否相同,如果不同,则视为异地登陆,并将这个地址信息存入到信息表中,并且发送给用户的邮箱,用户能在第一时间了解情况并作出相应决策,如图4.11,实现的代码如下: 图4.11收到异地登录提醒 public class IpUtils { private final static String getIpUrl = “http://ip.360.cn/IPShare/info“; private static HttpClientUtil httpClient = HttpClientUtil.getInstance(); public static Map<String, Object> getIpAddr() { String message = null; try { message = httpClient.get(getIpUrl); System.out.println(message); } catch (IOException e) { e.printStackTrace(); } Map<String, Object> ipMap = new HashMap<>(); JSONObject jsonObject = JSONObject.fromObject(message); ipMap.put(“ipAddress“, StringUtils.trim(jsonObject.getString(“ip“))); ipMap.put(“location“, StringUtils.trim(jsonObject.getString(“location“))); return ipMap; } } 4.4.4限制登录错误次数的实现 建一张表来记录用户id,错误登录次数,上次登录时间。登录失败后,进行校验:若已经错误登录5次,返回特定编码以告知前台显示错误信息。若次数不足5次,错误登录次数+1,并返回正常错误信息。若距离上一次错误登录时间已经过了1小时或者到了第二天,错误次数置为1。 若密码正确,并可以正常登录,将错误次数置为0。若处于锁定中,返回指定错误信息。具体实现代码如下: private static int maxTime = 5; private static double hour = 1; public Map<String, Object> validateByLoginIdLoginErr(String loginId, String password,boolean isJiaMi) throws DataAccessException { Map<String, Object> resultMap = new HashMap(2); User user = getByLoginId(loginId); String encodePass = ““; if (isJiaMi && null != isJiaMi) { encodePass = encrypt.encode(password); } if(null!=user){ if(user.getPassword().equals(encodePass)){ if(this.checkWhenPwdOk(user)){ this.setErrZero(user); resultMap.put(“user“, user); return resultMap; }else { resultMap.put(“extMsg“, “errMax“); return resultMap; } }else { if(this.checkErrNum(user)){ resultMap.put(“extMsg“, “errMax“); return resultMap; }else { return resultMap; } } } return resultMap; } private void setErrZero(User user){ SqlMapClientBuilder.buildSqlMapClient(Resources.getResourceAsReader(“config/SqlMap.xml“)); this.client.update(“login.err.updateForOk“, user); } 4.5实现系统其他功能 使用管理员的账号和密码登录之后,可以查看用户信息,管理留言信息,管理个人信息,管理理财信息,后台管理系统的数据流图如图4.12。 理财信息表 个人信息表 用户信息表 管理理财信息 管理个人信息 管理留言信息 查看用户信息 管理员 用户名、密码 判别 登录 无效用户名和密码 留言信息表 图4.12 后台管理系统数据流图 4.5.1员工信息管理的实现 管理员可以查看员工基本信息,包括用户名,姓名,年龄,权限等,同时可以修改已经存在用户的相关信息,并且可以实现员工的增删改查,实现界面如图4.13,实现代码如下: 图4.13 管理员工界面图 @RequestMapping(value=“/tjyonghu“, produces = “text/html;charset=UTF-8“) @ResponseBody public String tjyh(String yonghuming, String mima){ Yonghu y0 = new Yonghu(); y0.setYonghuming(yonghuming); int num = yh.getByConditionForNum(y0); y0.setStart(0); y0.setEnd(num); List<Yonghu> desc = yh.getYonghuByConditionDesc(y0); String f = ““; if (desc.size() > 0) { f = “此用户名已存在“; }else{ Yonghu y01 = new Yonghu(); y01.setYonghuming(yonghuming); y01.setMima(mima); y01.setQuanxian(“员工“); yh.insert(y01); f = “添加成功“; } JSONObject j = new JSONObject(); try { j.accumulate(“f“, f); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return j.toString(); } 4.5.2理财管理和账目管理的实现 开通了网上银行的员工,可以在银行管理系统里进行投资,主要是买卖股票、基金、债券、保险、外汇等理财产品。比如通过网上银行外汇买卖功能,客户可以方便、快捷地查询到外汇行情,及时进行外汇交易。系统只需要保证数据操作的安全性和准确性,对数据的来源是不关心的,例如对于基金,管理员只要知道当前价格等信息,而不用关心数据如何获得,但是想基金这样的理财产品,实时性特别高,价格变动必将频繁,这需要系统能够及时的更新理财产品的信息数据。实现界面如图4.14所示。 图4.14 理财管理界面图 4.5.3账户信息管理的实现 一个员工可以有多个账户,这些账户不用全都属于本银行,也可以拥有其他银行的账户,但他行账户应该签约。一个账户会有详细的信息,如账号、别名、币种、所属银行、状态等等。一个账户也应该会有对应的消费记录、记录和转账记录,同时在追加新账户时,这一部分是由员工自己完成的,员工在柜台开过户之后,就可以到银行管理上把新的账户添加到自己的员工名上去,这是要考虑到,已经在员工名下的账户是不能重复追加的,别人的账户是不能追加到自己的员工名下,并且追加账户是应该核对多个信息,以保证安全性。具体实现的代码如下: @RequestMapping(“/addcunqukuan“) public String addcunqukuan(CunQuKuan c){ SimpleDateFormat df = new SimpleDateFormat(“yyyy-MM-dd HH:mm:ss“); c.setTime(df.format(new Date())); cqk.insert(c); int money = kh.getKeHuByName(c.getKehu()).getMoney(); int now = (money+Integer.parseInt(c.getMoney())); KeHu kehu = new KeHu(); kehu.setMoney(now); kehu.setName(c.getKehu()); kh.updateByName(kehu); return “forward:cunqukuanguanli“; } 5 总结 本次毕业设计具有典型的SSM框架,基于MVC的设计思路,将整个系统划分为表现层,Controller层,Service层,Dao层四层,完成整个银行登录设计和系统功能的设计。其中,表现层由注册页面,登录页面组成。页面由Jsp代码实现,结合CSS与JS脚本实现了较为友好地人机交互界面。采用mybatis框架+Mysql数据库的形式,完成数据模型到数据库的映射。业务逻辑层实现了处理用户获取页面的请求,以及登录、注册、日志查看等功能。 这次的毕业设计考虑到了DES算法的安全性,DES算法具有相当高的复杂性,密码函数F的非线性性质非常好,起到了扰乱的效果,还遵循了SAC和BIC原则,这使得破译它的开销要超过可能得到的利益。此外,DES算法也存在一些漏洞,例如:DES算法中只用到64位密钥中的56位,而第8、16、24....64位这8个位并未参加DES运算。因此,在实际的应用过程中,应该避开使用这8位而使用其他的56位作为有效数据位,才能保证DES算法安全可靠地发挥作用。尽管DES算法存在有一些不足,但作为第一个公开密码算法的密码体制,它成功地完成了它的使命,并且,由于破解DES算法的花费可能远大于破解它得到的利益,因此,在数据加密上,DES算法依然是一个不错的选择。 当然,我们还在注册时运用到了邮件激活账号的思想,同时在登陆时,引入了异地登录提醒和限制登录次数错误的功能,这样做,最大程度了保证了用户的使用安全。 这次的毕业设计总体来说设计的比较合理,但是,由于时间关系,还有一部分的功能没有实现,在数据库那一块花费了许多时间,所以说,以后还要加强数据库相关的知识点。综上所述,本文对DES算法在密码存储的应用,设计了基于DES算法的登录系统,对结果进行了总结,存在不够完美的地方,也是未来的改进方向。 参考文献 [1] 李洋. SSM框架在Web应用开发中的设计与实现[J]. 计算机技术与发展, 2016, 26(12):190-194,共5页. [2] 邹红霆. 基于SSM框架的Web系统研究与应用[J]. 湖南理工学院学报(自科版), 2017, 30(1):39-43. [3] 田萍芳, 李跃新. MVC模式在JavaB/S开发中的应用研究[J]. 湖北大学学报(自科版), 2005, 27(2):137-139. [4] 胡美燕, 刘然慧. DES算法安全性的分析与研究[J]. 内蒙古大学学报(自然版), 2005, 36(6):693-697. [5] 管莹, 敬茂华. DES算法原理及实现[J]. 电脑编程技巧与维护, 2009(4):5-7. [6] 周文婷, 马凤伟, 孔庆. 基于DES算法的文件加密系统的设计与实现[J]. 计算机安全, 2012(7):13-16. [7] 谢文兰. 基于java数据库技术实现用户注册与登录界面[J]. 湖南工程学院学报(自然科学版), 2014, 24(2):45-48. [8] 佚名. 基于JavaMail的Web邮件验证系统设计[J]. 电子技术与软件工程, 2018, No.138(16):195-197. [9] 牛尧, 章文毅. 基于JavaMail的邮件管理系统的设计[J]. 科学技术与工程, 2008, 8(15):4188-4193. [10] Xiang F. Design Scheme of Secure Communication System for Image Based on CNN and DES[J]. Journal of South China University of Technology, 2007, 35(9):31-35. [11] Jian Z, Jin X. Encryption System Design Based on DES and SHA-1[C]// International Symposium on Distributed Computing & Applications to Business. 2012. [12] Reese G A. Database Programming with JDBC and Java, Second Edition[J]. 2000. [13] Bo Q. Secure Login for Web-Based Embedded Systems[M]// Communications and Information Processing. 2012. [14] Wang Y, Zi-Guo H, Luo Y G. Research and Application of Web System Development Architecture Based on Ext+Spring+Hibernate[J]. Computer & Modernization, 2009, 1(12):78-81. [15] Zhong L, Liu L, Xia H X. Development Research of Web Mail System Based on JavaMail API[J]. Journal of Wuhan University of Technology, 2006, 28(6):84-86. 致 谢 这次的毕业设计以及论文是在**的指导下完成的,在这里,我由衷的感谢张玲老师以及曾经帮助我和支持我的人们。在经历了多次的指导和修改,最终完成了我的论文,为此,我要衷心的向张玲老师表达深深的谢意。在我大学期间,我获得了同学们友谊,在我面对许许多多困难的时候,他们不遗余力的给我帮助,从来都不会拒绝,非常的耐心,这些我会受用终生,他们对我的帮助我从心里由衷的感谢。我还要感谢论文中引用文献的作者,如果没有他们的研究与写作,就没有我能参考的知识。最后,通过本次设计,让我对本次设计中所涉及到的知识有了更深刻的了解,为我今后的工作打下了坚实的基础,这样的机会十分难得。在今后的工作生活中,我会将我已经掌握的知识运用到其中,再接再厉。对于本文出现不足的位置,诚心接收各位的指点和纠正,谢谢。 本文档由香当网(https://www.xiangdang.net)用户上传

    下载文档到电脑,查找使用更方便

    文档的实际排版效果,会与网站的显示效果略有不同!!

    需要 10 香币 [ 分享文档获得香币 ]

    下载文档

    相关文档

    粒子群算法(优化算法)毕业设计论文

     毕 业 论 文 题 目 粒子群算法及其参数设置 专 业 信息与计算科学 班 级 ...

    2年前   
    737    0

    基于视觉的车道线识别算法研究毕业论文

    毕业设计基于视觉的车道线识别算法研究Research on Algorithms of Vision-basedLane Recognition 2009 届 电气与电子工程 分...

    5个月前   
    313    0

    基于行为多机器人编队算法开题报告

     **电子科技大学信息工程学院 毕业设计(论文)开题报告 题    目 基于行为的多机器人编队算法研究与实现 系 自 动 控 制 专    业 自 动 化 姓    名 费易...

    7年前   
    8762    0

    操作系统课程设计银行家算法报告

    《操作系统--银行家算法》课程设计报告姓 名: 学 号: 班 级:计科班 ...

    1个月前   
    165    0

    操作系统课程设计银行家算法的模拟实现

    操作系统课程设计报告专业计算机科学与技术学生姓名班级学号指导教师完成日期信息工程学院题目: 银行家算法的模拟实现 一、设计目的本课程设计是学习完“操作系统原理”课程后进...

    1个月前   
    164    0

    《操作系统 银行家算法》课程设计报告

    《操作系统--银行家算法》课程设计报告姓 名: 学 号: 班 级: 计科班 ...

    1个月前   
    179    0

    银行家算法《操作系统》课程设计报告

    《操作系统》课程设计报告课题: 银行家算法 专业计算机科学与技术学生姓名班级计算机学号指导教师信息工程...

    1个月前   
    120    0

    银行风险监管指标及算法

    商业银行风险监管核心指标一览表 指标类别 一级指标 二级指标 指标值             风险水平 流动性风险 1.流动性比例   大于等于25% 2.核心...

    5年前   
    5747    0

    基于内点法的电力系统最优潮流算法研究毕业论文

     本科毕业设计 题 目 基于内点法的电力系统最优潮流算法研究 XX大 学 毕 业 设 计(论文) 题目...

    2年前   
    961    0

    基于杂合遗传算法的Portfolio整数规划模型

    基于杂合遗传算法的Portfolio整数规划模型*基金项目:国家自然科学基金(79700016) 安向龙 李露凌 ...

    11年前   
    24104    0

    基于行人GPS轨迹提取路网信息的高效算法

    基于行人GPS轨迹提取路网信息的高效算法引言  当今时代,数字地图对于每一个人来说都变得日益重要。普通用户下载诸如Google地图、百度地图等类似软件来寻找目的地以及周围的景点、住宿和餐旅等等...

    4个月前   
    207    0

    基于蚁群算法的西安市长安区配送路线优化研究

    题目: 基于蚁群算法的西安市长安区配送 线路优化研究 院 系: 管理工程...

    3个月前   
    116    0

    操作系统课程设计编程序模拟银行家算法

    课程设计报告书 课程名称: 操作系统原理 题 目: 编程序模拟银行家算法 系 名: 信息工程系 专业班级: ...

    4周前   
    99    0

    毕业论文:TIPTOP双档算法设计与分析

    为了进一步完善现有的TIPTOP系统,针对工程部需求对企业设备进行有效登记管理,本人通过编写TIPTOP双档程序cfar222初步完成了对设备仪器的数据采集。在cfar281双档项目实施后,工程...

    2年前   
    948    0

    线索二叉树算法的设计与实现

    随着时代的不断进步,计算机技术也随之得到发展。数据结构在计算机技术的发展中起到巨大的作用。数据结构为构建出高效的计算机算法打下了坚实的基础。良好的数据结构能够提高算法效率的同时也能减少对系统资源的占用[

    2个月前   
    508    0

    基于单片机的时钟设计

    随着时间的推移,事物的发展越来越趋向于高科技,单片机的出现,受到了社会各界的广泛关注,这是由于单片机具备丰富的功能。单片机的特点为:尺寸小,价格低,抗干扰强,开发容易等。运用的范围也很广,如检测...

    4个月前   
    150    0

    基于VHDL语言的交通灯设计

     基于VHDL语言的 交通灯设计 专业班级: 应电班 作 者: 指导老师: ...

    2年前   
    562    0

    基于Android智能风扇的设计

    由于科技越来越发达,智能硬件也使用越来越多,基于蓝牙的技术开发以及应用也是快速的发展。其使用在Android系统和Windows系统等平台上都可以使用蓝牙无线模块。可以实现了主蓝牙设备和从设备它...

    4周前   
    183    0

    基于matlab的电力电子仿真设计报告

    课程设计(综合实验)报告( 2010-- 2011 年度第 1 学期)名 称:电力电子技术课程设计院 系:电气与电子工程学院班 级: 电气班 学 号:...

    4个月前   
    224    0

    基于SSE-CMM的数据网系统安全风险评估方案-解决方案

    基于SSE-CMM的数据网系统安全风险评估方案-解决方案   我国电信数据网是关系到国家安全的基础设施,是国家推动信息化发展的重要手段,其地位和重要性是不言而喻的。要解决电信数据网的安全问题,...

    9年前   
    183    0

    文档贡献者

    王***朝

    贡献于2020-12-23

    下载需要 10 香币 [香币充值 ]
    亲,您也可以通过 分享原创文档 来获得香币奖励!
    下载文档

    该用户的其他文档