1. 应用

使用MD5加密

因为:因为MD5的不可逆性,也可以保证你的key 是安全的,黑客无法通过原文和密文知晓你的key。

案例:

  1. import java.math.BigInteger;
  2. import java.security.MessageDigest;
  3.  
  4. public class MD5Util{
  5.  
  6. /**
  7. * 使用MD5加密
  8. * @param plainText
  9. * @return
  10. */
  11. public static String encryptionByMD5(String plainText) {
  12. String md5code;
  13. try {
  14. byte[] secretBytes = MessageDigest.getInstance("md5").digest(plainText.getBytes());
  15. md5code = new BigInteger(1, secretBytes).toString(16);
  16. for (int i = 0; i < 32 - md5code.length(); i++) {
  17. md5code = "0" + md5code;
  18. }
  19. } catch (Exception e) {
  20. throw new RuntimeException(e);
  21. }
  22. return md5code;
  23. }
  24. }
  1. import java.io.IOException;
  2.  
  3. public class Md5Test {
  4.  
  5. public static void main(String[] args) throws IOException {
  6. //网络传输过程中被篡改很容易。
  7. //可逆加密也一样,只要让别人知道加密方式,就可以先还原再修改,再以同样的方式加密,一样篡改了传输信息。
  8. // 根据几种加密方式就可以推出你使用的加密方式。
  9. String str = "姓名=蕾蕾,支付=1000,账户:123";
  10.  
  11. /**
  12. * 使用MD5是不可逆加密方式。
  13. * 就算黑客知道我是MD5加密的,他也不能通过密文反推我的原文是啥。
  14. */
  15. String result = MD5Util.encryptionByMD5(str);
  16. System.out.println(result);
  17. System.out.println("-----------实际使用场景------------");
  18. //先准备一个key 只有传输方和接收方知道。
  19. String key = "AHINTGJLL&&HH$%^";
  20. // 将原文和key拼接和一起使用MD5加密
  21. String resultMd5 = MD5Util.encryptionByMD5(str+key);
  22. //然后将原文和密文再拼接,然后传输。
  23. System.out.println(resultMd5);
  24. /**
  25. * 这样操作后,黑客拿到这个传输数据,改的了你的账户,金额,无法修改你的加密串,因为他无法知道你们约定的key:AHINTGJLL&&HH$%^.
  26. * 因为MD5的不可逆性,也可以保证你的key 是安全的,不能被黑客知晓。
  27. */
  28. System.out.println("传输:" +str+":"+resultMd5);
  29. }
  30. }

运行结果:

2 MD5 加密原理(如何做到不可逆)

MD5算法特点:

1. 加密结果:固定长度。

2. 加密速度快。

3. 细微:原文改变一点,加密结果变化巨大。

4. 不可逆:

最简单的不可逆加密:比如 原文是“57” ,加密方式是相加得到“12”。 这个时候你发现你知道加密结果是12,但是你无法知道原文是什么,因为“57”,“66”,“48” 等都有可能。

当然按照上面的加密方法,虽然不知道原文,但是破解太简单了。

算法:

1、数据填充

对消息进行数据填充,使消息的长度对512取模得448,设消息长度为X,即满足X mod 512=448。根据此公式得出需要填充的数据长度。

填充方法:在消息后面进行填充,填充第一位为1,其余为0。

2、添加消息长度

在第一步结果之后再填充上原消息的长度,可用来进行的存储长度为64位。如果消息长度大于264,则只使用其低64位的值,即(消息长度 对 264取模)。

在此步骤进行完毕后,最终消息长度就是512的整数倍。

3、数据处理

准备需要用到的数据:

4个常数: A = 0x67452301, B = 0x0EFCDAB89, C = 0x98BADCFE, D = 0x10325476;
4个函数:F(X,Y,Z)=(X & Y) | ((~X) & Z); G(X,Y,Z)=(X & Z) | (Y & (~Z));  H(X,Y,Z)=X ^ Y ^ Z; I(X,Y,Z)=Y ^ (X | (~Z));
把消息分以512位为一分组进行处理,每一个分组进行4轮变换,以上面所说4个常数为起始变量进行计算,重新输出4个变量,以这4个变量再进行下一分组的运算,如果已经是最后一个分组,则这4个变量为最后的结果,即MD5值。

实现:

  1. import java.math.BigInteger;
  2. import java.util.Arrays;
  3.  
  4. public class MD5 {
  5. //标准的幻数
  6. private static final int A=0x67452301;
  7. private static final int B=0xefcdab89;
  8. private static final int C=0x98badcfe;
  9. private static final int D=0x10325476;
  10.  
  11. //下面这些S11-S44实际上是一个4*4的矩阵,在四轮循环运算中用到
  12. static final int S11 = 7;
  13. static final int S12 = 12;
  14. static final int S13 = 17;
  15. static final int S14 = 22;
  16.  
  17. static final int S21 = 5;
  18. static final int S22 = 9;
  19. static final int S23 = 14;
  20. static final int S24 = 20;
  21.  
  22. static final int S31 = 4;
  23. static final int S32 = 11;
  24. static final int S33 = 16;
  25. static final int S34 = 23;
  26.  
  27. static final int S41 = 6;
  28. static final int S42 = 10;
  29. static final int S43 = 15;
  30. static final int S44 = 21;
  31.  
  32. //java不支持无符号的基本数据(unsigned)
  33. private int [] result={A,B,C,D};//存储hash结果,共4×32=128位,初始化值为(幻数的级联)
  34. //此重载方法是将传入的字符串加点特色(比如密码加密可以连同将用户名加入一起加密,这样就算密码和别人一样加密后的结果也不一样)
  35. private byte[] digest(String inputStr ,String salt) {
  36. return digest(salt+inputStr);
  37. }
  38. private byte[] digest(String inputStr){
  39. byte [] inputBytes=inputStr.getBytes();//将字符串转化成字节数组
  40. int byteLen=inputBytes.length;//长度(字节)
  41. int groupCount=0;//完整分组的个数
  42. groupCount=byteLen/64;//每组512位(64字节)
  43. int []groups=null;//每个小组(64字节)再细分后的16个小组(4字节)
  44.  
  45. //处理每一个完整分组
  46. for(int step=0;step<groupCount;step++){
  47. groups=divGroup(inputBytes,step*64);//处理分组,将每一个完整分组16个小组(16×4)
  48. trans(groups);//处理分组,核心算法
  49. }
  50.  
  51. //处理完整分组后的尾巴
  52. int rest=byteLen%64;//512位分组后的余数
  53. byte [] tempBytes=new byte[64];
  54. //余数小于<=56,先填充1,0数据,然后最后64位(8字节)储存长度
  55. if(rest<=56){
  56. //将尾巴先存储在临时数组中
  57. for(int i=0;i<rest;i++)
  58. tempBytes[i]=inputBytes[byteLen-rest+i];
  59. if(rest<56){
  60. //填充数据(448位之前第一个填充1,后面填充0)
  61. tempBytes[rest]=(byte)(1<<7);
  62. for(int i=1;i<56-rest;i++)
  63. tempBytes[rest+i]=0;
  64. }
  65. //后64位储存原文实际长度(448-512),即8字节
  66. long len=byteLen<<3;//长度单位是bit 即原文字节数组长度×8
  67. for(int i=0;i<8;i++){
  68. tempBytes[56+i]=(byte)(len&0xFF);//每次取长度的低八位存入字节数组
  69. len=len>>8;//取完移除低八位
  70. }
  71. groups=divGroup(tempBytes,0);
  72. trans(groups);//处理分组
  73. }else{//余数大于56,需增加一组主循环,目的保证处理后的原文最后64位(8字节)储存长度
  74. for(int i=0;i<rest;i++)
  75. //将尾巴先存储在临时数组中
  76. tempBytes[i]=inputBytes[byteLen-rest+i];
  77. //填充数据(第一个填充1,后面填充0)
  78. tempBytes[rest]=(byte)(1<<7);
  79. for(int i=rest+1;i<64;i++)
  80. tempBytes[i]=0;
  81. groups=divGroup(tempBytes,0);
  82. trans(groups);//处理分组
  83. //前56元素填充0
  84. for(int i=0;i<56;i++)
  85. tempBytes[i]=0;
  86. //后64位储存原文实际长度(448-512),即8字节
  87. long len=(long)(byteLen<<3);
  88. for(int i=0;i<8;i++){
  89. tempBytes[56+i]=(byte)(len&0xFF);
  90. len=len>>8;
  91. }
  92. groups=divGroup(tempBytes,0);
  93. trans(groups);//处理分组
  94. }
  95. //将hash值转换成字节数组
  96. //int[] result={A,B,C,D};共4×32=128位,每八位转换一个byte类型,储存在一个结果集
  97. byte[] resultByte = new byte[16];
  98. for(int i = 0;i<4;i++) {
  99. for(int j = 0; j < 4; j++) {
  100. //每次取低八位
  101. resultByte[i*4+j] = (byte) (result[i] & 0xff);
  102. //取完移除
  103. result[i]=result[i]>>8;
  104. }
  105. }
  106.  
  107. return resultByte;
  108. }
  109.  
  110. /**
  111. * 从inputBytes的index开始取512位,作为新的分组
  112. * 将每一个512位的分组再细分成16个小组,每个小组64位(8个字节)
  113. * @param inputBytes
  114. * @param index
  115. * @return
  116. */
  117. private static int[] divGroup(byte[] inputBytes,int index){
  118. int [] temp=new int[16];
  119. for(int i=0;i<16;i++){
  120. //从byte数组中取四个元素组成一个int类型保存在数组中
  121. //b2iu方法是将byte的最高位符号位转化为代表数值位
  122. temp[i]=b2iu(inputBytes[4*i+index])|
  123. (b2iu(inputBytes[4*i+1+index]))<<8|
  124. (b2iu(inputBytes[4*i+2+index]))<<16|
  125. (b2iu(inputBytes[4*i+3+index]))<<24;
  126. }
  127. //最后返回这分组
  128. return temp;
  129. }
  130.  
  131. /**
  132. * 这时不存在符号位(符号位存储不再是代表正负),所以需要处理一下
  133. * @param b
  134. * @return
  135. */
  136. public static int b2iu(byte b){//0x7F + 128=0xff
  137. return b < 0 ? b & 0x7F + 128 : b;
  138. }
  139.  
  140. /**
  141. * 主要的操作,四轮循环
  142. * @param groups--每一个分组512位(64字节)
  143. */
  144. private void trans(int[] groups) {
  145. int a = result[0], b = result[1], c = result[2], d = result[3];
  146. /*第一轮*/
  147. a = FF(a, b, c, d, groups[0], S11, 0xd76aa478); /* 1 */
  148. d = FF(d, a, b, c, groups[1], S12, 0xe8c7b756); /* 2 */
  149. c = FF(c, d, a, b, groups[2], S13, 0x242070db); /* 3 */
  150. b = FF(b, c, d, a, groups[3], S14, 0xc1bdceee); /* 4 */
  151. a = FF(a, b, c, d, groups[4], S11, 0xf57c0faf); /* 5 */
  152. d = FF(d, a, b, c, groups[5], S12, 0x4787c62a); /* 6 */
  153. c = FF(c, d, a, b, groups[6], S13, 0xa8304613); /* 7 */
  154. b = FF(b, c, d, a, groups[7], S14, 0xfd469501); /* 8 */
  155. a = FF(a, b, c, d, groups[8], S11, 0x698098d8); /* 9 */
  156. d = FF(d, a, b, c, groups[9], S12, 0x8b44f7af); /* 10 */
  157. c = FF(c, d, a, b, groups[10], S13, 0xffff5bb1); /* 11 */
  158. b = FF(b, c, d, a, groups[11], S14, 0x895cd7be); /* 12 */
  159. a = FF(a, b, c, d, groups[12], S11, 0x6b901122); /* 13 */
  160. d = FF(d, a, b, c, groups[13], S12, 0xfd987193); /* 14 */
  161. c = FF(c, d, a, b, groups[14], S13, 0xa679438e); /* 15 */
  162. b = FF(b, c, d, a, groups[15], S14, 0x49b40821); /* 16 */
  163.  
  164. /*第二轮*/
  165. a = GG(a, b, c, d, groups[1], S21, 0xf61e2562); /* 17 */
  166. d = GG(d, a, b, c, groups[6], S22, 0xc040b340); /* 18 */
  167. c = GG(c, d, a, b, groups[11], S23, 0x265e5a51); /* 19 */
  168. b = GG(b, c, d, a, groups[0], S24, 0xe9b6c7aa); /* 20 */
  169. a = GG(a, b, c, d, groups[5], S21, 0xd62f105d); /* 21 */
  170. d = GG(d, a, b, c, groups[10], S22, 0x2441453); /* 22 */
  171. c = GG(c, d, a, b, groups[15], S23, 0xd8a1e681); /* 23 */
  172. b = GG(b, c, d, a, groups[4], S24, 0xe7d3fbc8); /* 24 */
  173. a = GG(a, b, c, d, groups[9], S21, 0x21e1cde6); /* 25 */
  174. d = GG(d, a, b, c, groups[14], S22, 0xc33707d6); /* 26 */
  175. c = GG(c, d, a, b, groups[3], S23, 0xf4d50d87); /* 27 */
  176. b = GG(b, c, d, a, groups[8], S24, 0x455a14ed); /* 28 */
  177. a = GG(a, b, c, d, groups[13], S21, 0xa9e3e905); /* 29 */
  178. d = GG(d, a, b, c, groups[2], S22, 0xfcefa3f8); /* 30 */
  179. c = GG(c, d, a, b, groups[7], S23, 0x676f02d9); /* 31 */
  180. b = GG(b, c, d, a, groups[12], S24, 0x8d2a4c8a); /* 32 */
  181.  
  182. /*第三轮*/
  183. a = HH(a, b, c, d, groups[5], S31, 0xfffa3942); /* 33 */
  184. d = HH(d, a, b, c, groups[8], S32, 0x8771f681); /* 34 */
  185. c = HH(c, d, a, b, groups[11], S33, 0x6d9d6122); /* 35 */
  186. b = HH(b, c, d, a, groups[14], S34, 0xfde5380c); /* 36 */
  187. a = HH(a, b, c, d, groups[1], S31, 0xa4beea44); /* 37 */
  188. d = HH(d, a, b, c, groups[4], S32, 0x4bdecfa9); /* 38 */
  189. c = HH(c, d, a, b, groups[7], S33, 0xf6bb4b60); /* 39 */
  190. b = HH(b, c, d, a, groups[10], S34, 0xbebfbc70); /* 40 */
  191. a = HH(a, b, c, d, groups[13], S31, 0x289b7ec6); /* 41 */
  192. d = HH(d, a, b, c, groups[0], S32, 0xeaa127fa); /* 42 */
  193. c = HH(c, d, a, b, groups[3], S33, 0xd4ef3085); /* 43 */
  194. b = HH(b, c, d, a, groups[6], S34, 0x4881d05); /* 44 */
  195. a = HH(a, b, c, d, groups[9], S31, 0xd9d4d039); /* 45 */
  196. d = HH(d, a, b, c, groups[12], S32, 0xe6db99e5); /* 46 */
  197. c = HH(c, d, a, b, groups[15], S33, 0x1fa27cf8); /* 47 */
  198. b = HH(b, c, d, a, groups[2], S34, 0xc4ac5665); /* 48 */
  199.  
  200. /*第四轮*/
  201. a = II(a, b, c, d, groups[0], S41, 0xf4292244); /* 49 */
  202. d = II(d, a, b, c, groups[7], S42, 0x432aff97); /* 50 */
  203. c = II(c, d, a, b, groups[14], S43, 0xab9423a7); /* 51 */
  204. b = II(b, c, d, a, groups[5], S44, 0xfc93a039); /* 52 */
  205. a = II(a, b, c, d, groups[12], S41, 0x655b59c3); /* 53 */
  206. d = II(d, a, b, c, groups[3], S42, 0x8f0ccc92); /* 54 */
  207. c = II(c, d, a, b, groups[10], S43, 0xffeff47d); /* 55 */
  208. b = II(b, c, d, a, groups[1], S44, 0x85845dd1); /* 56 */
  209. a = II(a, b, c, d, groups[8], S41, 0x6fa87e4f); /* 57 */
  210. d = II(d, a, b, c, groups[15], S42, 0xfe2ce6e0); /* 58 */
  211. c = II(c, d, a, b, groups[6], S43, 0xa3014314); /* 59 */
  212. b = II(b, c, d, a, groups[13], S44, 0x4e0811a1); /* 60 */
  213. a = II(a, b, c, d, groups[4], S41, 0xf7537e82); /* 61 */
  214. d = II(d, a, b, c, groups[11], S42, 0xbd3af235); /* 62 */
  215. c = II(c, d, a, b, groups[2], S43, 0x2ad7d2bb); /* 63 */
  216. b = II(b, c, d, a, groups[9], S44, 0xeb86d391); /* 64 */
  217.  
  218. /*加入到之前计算的结果当中*/
  219. result[0] += a;
  220. result[1] += b;
  221. result[2] += c;
  222. result[3] += d;
  223. result[0]=result[0]&0xFFFFFFFF;
  224. result[1]=result[1]&0xFFFFFFFF;
  225. result[2]=result[2]&0xFFFFFFFF;
  226. result[3]=result[3]&0xFFFFFFFF;
  227. }
  228.  
  229. /**
  230. * 下面是处理要用到的线性函数
  231. */
  232. private static int F(int x, int y, int z) {
  233. return (x & y) | ((~x) & z);
  234. }
  235.  
  236. private static int G(int x, int y, int z) {
  237. return (x & z) | (y & (~z));
  238. }
  239.  
  240. private static int H(int x, int y, int z) {
  241. return x ^ y ^ z;
  242. }
  243.  
  244. private static int I(int x, int y, int z) {
  245. return y ^ (x | (~z));
  246. }
  247.  
  248. private static int FF(int a, int b, int c, int d, int x, int s,
  249. int ac) {
  250. a += (F(b, c, d)&0xFFFFFFFF) + x + ac;
  251. //<<<s表示循环左移s位,解决Java中无该运算符
  252. a = ((a&0xFFFFFFFF)<< s) | ((a&0xFFFFFFFF) >>> (32 - s));
  253. a += b;
  254. return (a&0xFFFFFFFF);
  255. }
  256.  
  257. private static int GG(int a, int b, int c, int d, int x, int s,
  258. int ac) {
  259. a += (G(b, c, d)&0xFFFFFFFF) + x + ac;
  260. a = ((a&0xFFFFFFFF) << s) | ((a&0xFFFFFFFF) >>> (32 - s));
  261. a += b;
  262. return (a&0xFFFFFFFF);
  263. }
  264.  
  265. private static int HH(int a, int b, int c, int d, int x, int s,
  266. long ac) {
  267. a += (H(b, c, d)&0xFFFFFFFF) + x + ac;
  268. a = ((a&0xFFFFFFFF) << s) | ((a&0xFFFFFFFF) >>> (32 - s));
  269. a += b;
  270. return (a&0xFFFFFFFF);
  271. }
  272.  
  273. private static int II(int a, int b, int c, int d, int x, int s,
  274. long ac) {
  275. a += (I(b, c, d)&0xFFFFFFFF) + x + ac;
  276. a = ((a&0xFFFFFFFF) << s) | ((a&0xFFFFFFFF) >>> (32 - s));
  277. a += b;
  278. return (a&0xFFFFFFFF);
  279. }
  280. //清除缓存,将int[] result={A,B,C,D},还原为初始状态
  281. public void reset() {
  282. result[0] = A;
  283. result[1] = B;
  284. result[2] = C;
  285. result[3] = D;
  286. }
  287.  
  288. public static void main(String []args){
  289. MD5 md=new MD5();
  290. byte[] digest = md.digest("姓名=蕾蕾,支付=1000,账户:123");
  291. String md5code = new BigInteger(1, digest).toString(16);
  292. for (int i = 0; i < 32 - md5code.length(); i++) {
  293. md5code = "0" + md5code;
  294. }
  295. System.out.println(md5code);
  296. }
  297. }

运行结果:

对比Java 自带的MD5 加密结果一样。

破解MD5方法有:王小云破解。

参考:https://blog.csdn.net/JunhuiXie/article/details/100630841#%E7%AC%AC%E4%B8%80%E6%AD%A5%3A%E5%A4%84%E7%90%86%E5%8E%9F%E6%96%87%C2%A0

《Java知识应用》Java加密方式(MD5)详解的更多相关文章

  1. 转 Java虚拟机5:Java垃圾回收(GC)机制详解

    转 Java虚拟机5:Java垃圾回收(GC)机制详解 Java虚拟机5:Java垃圾回收(GC)机制详解 哪些内存需要回收? 哪些内存需要回收是垃圾回收机制第一个要考虑的问题,所谓“要回收的垃圾”无 ...

  2. Java生鲜电商平台-Java后端生成Token架构与设计详解

    Java生鲜电商平台-Java后端生成Token架构与设计详解 目的:Java开源生鲜电商平台-Java后端生成Token目的是为了用于校验客户端,防止重复提交. 技术选型:用开源的JWT架构. 1. ...

  3. Java面试题(1):详解int与Integer

    Java面试题(1):详解int与Integer int与Integer的区别 int是Java的基本数据类型之一,Integer是int的包装类 int直接再内存中储存值,Integer进行new操 ...

  4. 把java文件打包成.jar (jar命令详解)

    把java文件打包成.jar (jar命令详解) 先打开命令提示符(win2000或在运行框里执行cmd命令,win98为DOS提示符),输入jar Chelp,然后回车(如果你盘上已经有了jdk1. ...

  5. Java进阶(三十二) HttpClient使用详解

    Java进阶(三十二) HttpClient使用详解 Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们 ...

  6. Java WebService接口生成和调用 图文详解>【转】【待调整】

    webservice简介: Web Service技术, 能使得运行在不同机器上的不同应用无须借助附加的.专门的第三方软件或硬件, 就可相互交换数据或集成.依据Web Service规范实施的应用之间 ...

  7. Java中的equals和hashCode方法详解

    Java中的equals和hashCode方法详解  转自 https://www.cnblogs.com/crazylqy/category/655181.html 参考:http://blog.c ...

  8. JAVA消息服务JMS规范及原理详解

    JAVA消息服务JMS规范及原理详解 一.简介 JMS即Java消息服务(Java Message Service)应用程序接口,是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应 ...

  9. Java基础-反射(reflect)技术详解

    Java基础-反射(reflect)技术详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.类加载器 1>.JVM 类加载机制  如下图所示,JVM类加载机制分为五个部分 ...

  10. Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程 ...

随机推荐

  1. Android中常见的设计模式

    前言: Android开发的设计模式,基本设计思想源于java的设计模式,java的设计模式有N多种,据不完全统计,迄今为止,网络出现最频繁的大概有23种.Java只是一门开发语言,学会并掌握这门语言 ...

  2. web 开发常用字符串表达式匹配

    记录一下 web 开发中常用的一些字符串模式,这是我遇到的一些,后面如果还有的话,欢迎大神提出,会继续更新. 正则表达式 这个主要用在前端的验证,nginx 路径匹配,shell 脚本文本处理,后端感 ...

  3. Java 数据类型、变量

    Java 数据类型   在 Java 中,对于每一种数据都定义了明确的具体的数据类型,在内存中分配了不同大小的内存空间. 整数类型 (byte.short.int.long) 1.Java 各整数类型 ...

  4. Python拼接字符串的七种方式

    忘了在哪看到一位编程大牛调侃,他说程序员每天就做两件事,其中之一就是处理字符串.相信不少同学会有同感. 几乎任何一种编程语言,都把字符串列为最基础和不可或缺的数据类型.而拼接字符串是必备的一种技能.今 ...

  5. python3 之 内置函数range()

    一.语法: range(stop) range(start,stop,step) start:计数从start开始,默认是从0开始.eg:range(5)等价于range(0,5) stop:计数到s ...

  6. Java流程控制之(一)条件

    目录 条件语句 单if情况 单if/else情况 if/else多分支情况 switch条件语句 条件语句+循环语句,直接甩图甩代码! 条件语句 Java希望在某个条件为真时执行相应的语句. 单if情 ...

  7. FullGC排查心得

    最近线上系统(JDK1.7)出现了多次FullGC,但是情况都不一样,今天有时间,将FullGC的排查思路以及如何解决记录下,供大家一起探讨. 场景一: 系统发布上线之后,里面收到如下告警信息: 内容 ...

  8. scrapy抓取国家社科基金项目数据库

    1.明确任务 目标网站:http://fz.people.com.cn/skygb/sk/index.php/Index/seach 抓取任务:抓取近五年某关键词(例如"能源".” ...

  9. 异常:java.lang.RuntimeException: Canvas: trying to draw too large(161740800bytes) bitmap

    现象 今天做一个安卓项目的时候,我使用了10张图片,这10张图片都是放在了drawable目录下. 根据这个错误,我在网上寻找解决问题的方案,然后我放在了mipmap-xxhdpi下结果可以运行. 但 ...

  10. 12-kubernetes Dashboard 认证及分级授权

    目录 部署 dashboard 查看 开放访问 配置dashboard用户 1. token 令牌认证 创建一个 serviceAccount dashboard-admin 绑定 clusterbi ...