-SHA256.java
public class SHA256 {
/**
* SHA-256 암호화 함
* @param source 원본
* @param salt(String) SALT 값
* @return
*/
public static String getEncrypt(String source, String salt) {
return getEncrypt(source, salt.getBytes());
}
/**
* SHA-256 암호화 함
* @param source 원본
* @param salt(byte[]) SALT 값
* @return
*/
public static String getEncrypt(String source, byte[] salt) {
String result = "";
byte[] a = source.getBytes();
byte[] bytes = new byte[a.length + salt.length];
System.arraycopy(a, 0, bytes, 0, a.length);
System.arraycopy(salt, 0, bytes, a.length, salt.length);
try {
// 암호화 방식 지정 메소드
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(bytes);
byte[] byteData = md.digest();
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++) {
sb.append(Integer.toString((byteData[i] & 0xFF) + 256, 16).substring(1));
}
result = sb.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return result;
}
/**
* SALT를 얻어온다.
* @return
*/
public static String generateSalt() {
Random random = new Random();
byte[] salt = new byte[8];
random.nextBytes(salt);
StringBuffer sb = new StringBuffer();
for (int i = 0; i < salt.length; i++) {
// byte 값을 Hex 값으로 바꾸기.
sb.append(String.format("%02x",salt[i]));
}
return sb.toString();
}
}
SHA256 클래스를 만들어준다.
SHA256으로 해쉬를 하여 관리가 되지만
SHA256을 사용하면 같은 값은 같은 해쉬값으로 나와 비밀번호에 적합하지 않은거 같다.
그래서 회원의 고유식별을 위해 SALT를 추가 하여 한번더 비밀번호 값을 변경하는 방법이 좋은거 같다.
그렇게 하기 위해서는
회원정보나 필요한 테이블에 SALT 컬럼을 만들어준다.
그 후 사용하고자 하는 함수에 넣어준다. 나는 map을 사용하였기 때문에 param에 넣어준다.
그리고는 회원가입시 SALT 난수 생성을 해준 후 입력받은 비밀번호를 다시 암호화 해준다.
String SALT = sha256.generateSalt(); //SALT 난수 생성
param.put("SALT",SALT); //SALT 값 param에 넣기 ex :
param.put("password", sha256.getEncrypt(param.get("PW").toString(),SALT)); //SALT / SHA256 값 다시 암호화
// param.get("PW").toString() ->이 부분을 member.getPassword() 이런식으로 변경해주면 된다.
그 후 password값을 SQL문에 넣어준다.
그리고 로그인을 비교할때는 쿼리로 SALT 값을 받아와 다시 SHA256과 함께 암호화를 진행한다.
이 부분에서는 SHA256을 복호화 하는것이 아닌 PW의 값과 SALT의 값을 다시 암호화 해서
DB에 있는 암호화된 비밀번호 자체를 비교하는 것이다.
Map<String,Object> rsSaltMap = new HashMap<String,Object>();
SHA256 sha256 = new SHA256();
param.put("SALT", rsSaltMap.get("SALT"));
param.put("PASSWORD", sha256.getEncrypt(param.get("PW").toString(),rsSaltMap.get("SALT").toString()));
Vue.prototype.$SHA256 = function(s){
var chrsz = 8;
var hexcase = 0;
function safe_add (x, y) {
var lsw = (x & 0xFFFF) + (y & 0xFFFF);
var msw = (x >> 16) + (y >> 16) + (lsw >> 16);
return (msw << 16) | (lsw & 0xFFFF);
}
function S (X, n) { return ( X >>> n ) | (X << (32 - n)); }
function R (X, n) { return ( X >>> n ); }
function Ch(x, y, z) { return ((x & y) ^ ((~x) & z)); }
function Maj(x, y, z) { return ((x & y) ^ (x & z) ^ (y & z)); }
function Sigma0256(x) { return (S(x, 2) ^ S(x, 13) ^ S(x, 22)); }
function Sigma1256(x) { return (S(x, 6) ^ S(x, 11) ^ S(x, 25)); }
function Gamma0256(x) { return (S(x, 7) ^ S(x, 18) ^ R(x, 3)); }
function Gamma1256(x) { return (S(x, 17) ^ S(x, 19) ^ R(x, 10)); }
function core_sha256 (m, l) {
var K = new Array(0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5, 0x3956C25B, 0x59F111F1,
0x923F82A4, 0xAB1C5ED5, 0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174, 0xE49B69C1, 0xEFBE4786,
0xFC19DC6, 0x240CA1CC, 0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7, 0xC6E00BF3, 0xD5A79147,
0x6CA6351, 0x14292967, 0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85, 0xA2BFE8A1, 0xA81A664B,
0xC24B8B70, 0xC76C51A3, 0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5, 0x391C0CB3, 0x4ED8AA4A,
0x5B9CCA4F, 0x682E6FF3, 0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2);
var HASH = new Array(0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A, 0x510E527F,
0x9B05688C, 0x1F83D9AB, 0x5BE0CD19);
var W = new Array(64);
var a, b, c, d, e, f, g, h, i, j;
var T1, T2;
m[l >> 5] |= 0x80 << (24 - l % 32);
m[((l + 64 >> 9) << 4) + 15] = l;
for ( var i = 0; i<m.length; i+=16 ) {
a = HASH[0];
b = HASH[1];
c = HASH[2];
d = HASH[3];
e = HASH[4];
f = HASH[5];
g = HASH[6];
h = HASH[7];
for ( var j = 0; j<64; j++) {
if (j < 16) W[j] = m[j + i];
else W[j] = safe_add(safe_add(safe_add(Gamma1256(W[j - 2]), W[j - 7]), Gamma0256(W[j - 15])), W[j - 16]);
T1 = safe_add(safe_add(safe_add(safe_add(h, Sigma1256(e)), Ch(e, f, g)), K[j]), W[j]);
T2 = safe_add(Sigma0256(a), Maj(a, b, c));
h = g;
g = f;
f = e;
e = safe_add(d, T1);
d = c;
c = b;
b = a;
a = safe_add(T1, T2);
}
HASH[0] = safe_add(a, HASH[0]);
HASH[1] = safe_add(b, HASH[1]);
HASH[2] = safe_add(c, HASH[2]);
HASH[3] = safe_add(d, HASH[3]);
HASH[4] = safe_add(e, HASH[4]);
HASH[5] = safe_add(f, HASH[5]);
HASH[6] = safe_add(g, HASH[6]);
HASH[7] = safe_add(h, HASH[7]);
}
return HASH;
}
function str2binb (str) {
var bin = Array();
var mask = (1 << chrsz) - 1;
for(var i = 0; i < str.length * chrsz; i += chrsz) {
bin[i>>5] |= (str.charCodeAt(i / chrsz) & mask) << (24 - i%32);
}
return bin;
}
function Utf8Encode(string) {
string = string.replace(/\r\n/g,"\n");
var utftext = "";
for (var n = 0; n < string.length; n++) {
var c = string.charCodeAt(n);
if (c < 128) {
utftext += String.fromCharCode(c);
}
else if((c > 127) && (c < 2048)) {
utftext += String.fromCharCode((c >> 6) | 192);
utftext += String.fromCharCode((c & 63) | 128);
}
else {
utftext += String.fromCharCode((c >> 12) | 224);
utftext += String.fromCharCode(((c >> 6) & 63) | 128);
utftext += String.fromCharCode((c & 63) | 128);
}
}
return utftext;
}
function binb2hex (binarray) {
var hex_tab = hexcase ? "0123456789ABCDEF" : "0123456789abcdef";
var str = "";
for(var i = 0; i < binarray.length * 4; i++) {
str += hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8+4)) & 0xF) +
hex_tab.charAt((binarray[i>>2] >> ((3 - i%4)*8 )) & 0xF);
}
return str;
}
s = Utf8Encode(s);
return binb2hex(core_sha256(str2binb(s), s.length * chrsz));
}
여기서 만약 param값을 넘기는데 비밀번호가 노출이된다고 생각을 하면 vue에서 사용을 해서 값을 넘기면 되었다.
나는 공통 js에 넣어
this.$SHA256('PW값'); 을 사용하여 파람으로 넘겨 주었다.
출처 : https://epthffh.tistory.com/entry/SHA256-%EC%9D%B8%EC%BD%94%EB%94%A9-%EC%86%8C%EC%8A%A4
'JAVA' 카테고리의 다른 글
| super 키워드 , 다운캐스팅 , instanceof (3) | 2025.07.15 |
|---|---|
| object 클래스 ,string 관련 (0) | 2025.07.15 |
| 자바에서 비교 시 equals / == 비교 (0) | 2025.04.26 |
| 자바 메모리 구조 (0) | 2025.04.26 |
| 오버라이딩 과 오버로딩 (0) | 2025.04.26 |