대칭키 암호화 데이터 뷰테이블에서 복호화 하는 방법 / DecryptByKeyAutoCert

DataBase/MS-SQL|2018. 9. 12. 11:16
반응형

대칭키를 이용한 DB 암호화 처리 작업 시 


아래와 같이 대칭키와 인증서 OPEN 후 암복호화를 해야하는 것으로 알고 있었음.


OPEN SYMMETRIC 대칭키이름 DECRYPTION BY CERTIFICATE 인증서이름;


그런데 문제는 일반 프로시저나 웹 소스에서는 문제가 없으나


외부에 뷰테이블 형태로 제공하는 데이터가 있었는데 뷰테이블에서는 


그때까지만 해도.. OPEN SYMMETRIC 을 할수 없는게..아닌가..하고 난감했지만..




https://docs.microsoft.com/ko-kr/sql/t-sql/functions/decryptbykeyautocert-transact-sql?view=sql-server-2017


DecryptByKeyAutoCert 내장 함수를 사용하면 가능해진다는 것..





--Create the keys and certificate. USE AdventureWorks2012; CREATE MASTER KEY ENCRYPTION BY PASSWORD = 'mzkvdlk979438teag$$ds987yghn)(*&4fdg^'; OPEN MASTER KEY DECRYPTION BY PASSWORD = 'mzkvdlk979438teag$$ds987yghn)(*&4fdg^'; CREATE CERTIFICATE HumanResources037 WITH SUBJECT = 'Sammamish HR', EXPIRY_DATE = '10/31/2009'; CREATE SYMMETRIC KEY SSN_Key_01 WITH ALGORITHM = DES ENCRYPTION BY CERTIFICATE HumanResources037; GO ----Add a column of encrypted data. ALTER TABLE HumanResources.Employee ADD EncryptedNationalIDNumber varbinary(128); OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE HumanResources037 ; UPDATE HumanResources.Employee SET EncryptedNationalIDNumber = EncryptByKey(Key_GUID('SSN_Key_01'), NationalIDNumber); GO -- --Close the key used to encrypt the data. CLOSE SYMMETRIC KEY SSN_Key_01; -- --There are two ways to decrypt the stored data. -- --OPTION ONE, using DecryptByKey() --1. Open the symmetric key --2. Decrypt the data --3. Close the symmetric key OPEN SYMMETRIC KEY SSN_Key_01 DECRYPTION BY CERTIFICATE HumanResources037; SELECT NationalIDNumber, EncryptedNationalIDNumber AS 'Encrypted ID Number', CONVERT(nvarchar, DecryptByKey(EncryptedNationalIDNumber)) AS 'Decrypted ID Number' FROM HumanResources.Employee; CLOSE SYMMETRIC KEY SSN_Key_01; -- --OPTION TWO, using DecryptByKeyAutoCert() SELECT NationalIDNumber, EncryptedNationalIDNumber AS 'Encrypted ID Number', CONVERT(nvarchar, DecryptByKeyAutoCert ( cert_ID('HumanResources037') , NULL ,EncryptedNationalIDNumber)) AS 'Decrypted ID Number' FROM HumanResources.Employee;


댓글()

ip 주소로 국가 조회하는 방법 about.ip2c.org API

Open API/그 외 |2018. 8. 30. 17:08
반응형

아이피주소로 국가 조회하기


서비스하는 내용이 국가별로 제한되는 부분이라


DB를 구축하자니 그 업데이트관리가 문제이고


API가 있지 않을까 해서 구글링을 통해 알게된 사이트입니다.



https://about.ip2c.org



Request : 


https://ip2c.org/8.8.8.8


Response : 


1;US;USA;United States


; 로 구분자가 지정되어있으며


0 : WRONG INPUT , 1 : NORMAL , 2 : UNKNOWN 


US : ISO 국가코드 








아래 내용은 about.ip2c.org 사이트에서 발췌한 INPUT/OUTPUT 설명입니다.

 
==== Accepted inputs: ============================================================

You can use http or https.

https://ip2c.org/XXX.XXX.XXX.XXX
or
https://ip2c.org/?ip=XXX.XXX.XXX.XXX
|
+ standard IPv4 from 0.0.0.0 to 255.255.255.255
+ e.g. we take your IP:
    |
    + URL looks like this:  https://ip2c.org/128.134.3.161
    |                       or
    |                       https://ip2c.org/?ip=128.134.3.161
    |
    + resulting string is:  1;KR;KOR;Korea Republic of


https://ip2c.org/XXXXXXXXXX
or
https://ip2c.org/?dec=XXXXXXXXXX
|
+ decimal number from 0 to 4294967295 (MAX_INT)
+ faster than ?ip= option, less server-side processing
+ to convert IPv4 to decimal you only need to know this:
    |
    + (IPv4) A.B.C.D == A*256^3 + B*256^2 + C*256 + D (decimal)
    + e.g.   5.6.7.8 == 5*256^3 + 6*256^2 + 7*256 + 8
                     == 5*16777216 + 6*65536 + 7*256 + 8
                     == 83886080 + 393216 + 1792 + 8
                     == 84281096


https://ip2c.org/s
or
https://ip2c.org/self
or
https://ip2c.org/?self
|
+ processes caller's IP
+ faster than ?dec= option but limited to one purpose - give info about yourself


Caution
Some clients (e.g. ASP) may have issues while trying to open a file over HTTP.
In that case a slash / preceding ?ip= is obligatory.
==== Possible outputs: ===========================================================

You can use http or https.

0;;;WRONG INPUT
|
+ your request has not been processed due to invalid syntax
    |
    + e.g. bad IPv4 like 300.400.abc.256
    + e.g. bad decimal like 2a3b4c or bigger than MAX_INT


1;CD;COD;COUNTRY
|
+ contains two-letter (ISO 3166) and three-letter country codes, and a full country name
+ country name may be multi-word and contain spaces
+ e.g. we take your IP:
    |
    + URL looks like this:  https://ip2c.org/128.134.3.161
    |                       or
    |                       https://ip2c.org/?ip=128.134.3.161
    |
    + resulting string is:  1;KR;KOR;Korea Republic of


2;;;UNKNOWN
|
+ given ip/dec not found in database or not yet physically assigned to any country


The first digit indicates status so you don't have to always parse the whole string.
Output is always semicolon delimited text/plain - you can pass it to any type of application.


댓글()

cmd 창에서 파일 속성 변경하기 - ATTRIB

OS/Microsoft|2018. 8. 30. 16:01
반응형


ATTRIB 명령어를 사용하면 파일의 속성을 변경할 수 있습니다.


우선 이 옵션을 찾아보게 된 계기가...


여러위치에 위치한 파일들의 읽기 전용 속성을 일괄 변경하기 위함이었습니다.



패치파일을 하나 생성 한뒤 r 옵션을 적용하는데 매우 간단 명료하게 

- , + 로 옵션을 적용 해제 합니다.


# 읽기전용 해제 시 
attrib -r "파일경로 및 파일명"

#읽기전용 적용 시
attrib +r "파일경로 및 파일명"




프롬프트창에서 확인 가능한 상세 옵션입니다.


(c) 2017 Microsoft Corporation. All rights reserved.


C:\Users\Administrator>Attrib /?

Displays or changes file attributes.


ATTRIB [+R | -R] [+A | -A] [+S | -S] [+H | -H] [+O | -O] [+I | -I] [+P | -P] [+U | -U]

       [drive:][path][filename] [/S [/D]] [/L]


  +   Sets an attribute.

  -   Clears an attribute.

  R   Read-only file attribute.

  A   Archive file attribute.

  S   System file attribute.

  H   Hidden file attribute.

  O   Offline attribute.

  I   Not content indexed file attribute.

  X   No scrub file attribute.

  V   Integrity attribute.

  P   Pinned attribute.

  U   Unpinned attribute.

  [drive:][path][filename]

      Specifies a file or files for attrib to process.

  /S  Processes matching files in the current folder

      and all subfolders.

  /D  Processes folders as well.

  /L  Work on the attributes of the Symbolic Link versus

      the target of the Symbolic Link



C:\Users\Administrator>




댓글()

[뽐뿌 지름후기] Inland Professional 480GB 3D TLC NAND SATA III 6Gb/s 2.5" SSD 아마존 직구

추천 정보|2018. 7. 19. 23:37
반응형


요즘 뽐뿌에 자주 등장하는 SSD..


그 중 적당한 시점에 적당한 가격으로 구매한 SSD !!


Inland Professional 480GB 3D TLC NAND SATA III 6Gb/s 2.5" SSD


아마존 직구..내용 약 78달러..배송은 약 1주일





대세인 3D NAND 와 D램 캐시가 있는 제품.


잘은 모르지만 일단 D램 캐시가 있는 제품이 여러모로 속도와 안정성이 좋다고 함.


전문 지식이 없기 때문에 커뮤니티 귀동냥..ㅎㅎ


딱 설치 후 바로 직행한 속도 테스트.


꽤나 양호한 속도가 나와 주었습니다.


환경에 따라 속도 차이는 나는듯한데 어떤 후기에서는 


+50 ~ 100 MB/s 정도의 높은 수치를 보이는 경우도 있었습니다.


스펙상으로는 그게 정상인것같지만 충분히 만족스럽네요.







이렇게 오래된 pc에 새생명을 불어넣어주었습니다.

댓글()

[윈도우 10 / Windows 10] 응용 프로그램 항상 관리자 권한으로 실행하는 방법

OS/Microsoft|2018. 7. 10. 10:06
반응형


프로그램

항상 관리자 권한으로 실행하는 방법


일부 윈도우 응용프로그램의 경우 관리자 권한으로 실행해야하는 경우가 있는데


이러한 응용 프로그램의 경우 보통은 더블클릭만으로 실행하기 때문에 


자주 사용해야한다면 꽤나 불편한데요.



▼ 보통은 아래와 같이 실행합니다..




▼ 실행 파일의 속성 > 호환성 > 설정 > 관리자 권한으로 이 프로그램 실행 체크




해주면 다음부터는 더블클릭만으로 관리자 권한으로 실행됩니다.


이상 10원짜리 팁이었습니다.

댓글()

[Google Map] Places search box 구글 자동완성을 이용한 위경도 값 가져오기

Open API/Google|2018. 7. 4. 15:28
반응형

구글맵 위치정보를 활용한 

자동완성 기능을 적용시키는 샘플



구글의 정보는 정말 말로 할수없을 만큼 방대합니다.


그 중에서 맵데이터는 정말 놀라운데요.


기존에 장소(정확히는 도시별)별 위경도 값을 직접 데이터관리하던 부분을


구글 장소 검색 ( Places Search Box ) 기능으로 대체하게 되었습니다.


잘 구축된 API를 잘 가져다 쓰면 되기 때문에 참 편하죠.


자동완성의 반응속도도 빠르고 나름 직접 관리하는 것보다 정확하기 때문에 


여러모로 유용할것같습니다.


실제로 구현 하는 경우에는 가장 하단에 Js 참조할때 key 값을 입력해야합니다.


https://maps.googleapis.com/maps/api/js?key=여기에키값입력&libraries=places&callback=initAutocomplete

가져온 데이터에서 위경도 값을 읽어오는 부분은 
 

// place 에서 위경도 값을 읽어올 수 있음. 


▲  이라고 주석이 달린 부분을 참고하시면 될것같습니다.








◎ 실제로 구글 API의 Response값을 체크해서 데이터를 확인해보겠습니다. ( 크롬기준 )




1. 샘플 페이지를 열어서 F12를 눌러 개발자 도구를 실행하고 Network 탭으로 이동

그리고 키워드 검색을 통해 자동완성목록이 보여지는것을 확인.

그와 동시에 AutocompletionService.GetQueryPredictions 페이지를 호출하여 값을 가져옴.


(아래 이미지는 클릭하면 커집니다)




2. 목록 중 하나를 선택 했을 때 PlaceService.GetPlaceDetails 페이지를 호출하여 상세 정보를 가져옴.


(아래 이미지는 클릭하면 커집니다)



3. 해당 호출에 대한 Request


(아래 이미지는 클릭하면 커집니다)



4. 해당 호출에 대한 Response 데이터 , 이렇게 확인이 가능합니다.

실제로 Respons되는 데이터의 항목이 다양한데 이 또한 필요에 따라 활용이 가능할것같습니다.


(아래 이미지는 클릭하면 커집니다)





아래 코드의 99%는 


https://developers.google.com/maps/documentation/javascript/examples/places-searchbox


에서도 확인 하실 수 있습니다.



<!DOCTYPE html>
<html>

<head>
	<meta name="viewport" content="initial-scale=1.0, user-scalable=no">
	<meta charset="utf-8">
	<title>Places Searchbox</title>
	<style>
		/* Always set the map height explicitly to define the size of the div
       * element that contains the map. */

		#map {
			height: 100%;
		}

		/* Optional: Makes the sample page fill the window. */

		html,
		body {
			height: 100%;
			margin: 0;
			padding: 0;
		}

		#description {
			font-family: Roboto;
			font-size: 15px;
			font-weight: 300;
		}

		#infowindow-content .title {
			font-weight: bold;
		}

		#infowindow-content {
			display: none;
		}

		#map #infowindow-content {
			display: inline;
		}

		.pac-card {
			margin: 10px 10px 0 0;
			border-radius: 2px 0 0 2px;
			box-sizing: border-box;
			-moz-box-sizing: border-box;
			outline: none;
			box-shadow: 0 2px 6px rgba(0, 0, 0, 0.3);
			background-color: #fff;
			font-family: Roboto;
		}

		#pac-container {
			padding-bottom: 12px;
			margin-right: 12px;
		}

		.pac-controls {
			display: inline-block;
			padding: 5px 11px;
		}

		.pac-controls label {
			font-family: Roboto;
			font-size: 13px;
			font-weight: 300;
		}

		#pac-input {
			background-color: #fff;
			font-family: Roboto;
			font-size: 15px;
			font-weight: 300;
			margin-left: 12px;
			padding: 0 11px 0 13px;
			text-overflow: ellipsis;
			width: 400px;
		}

		#pac-input:focus {
			border-color: #4d90fe;
		}

		#title {
			color: #fff;
			background-color: #4d90fe;
			font-size: 25px;
			font-weight: 500;
			padding: 6px 12px;
		}

		#target {
			width: 345px;
		}
	</style>
</head>

<body> <input id="pac-input" class="controls" type="text" placeholder="Search Box">
	<div id="map"></div>
	<script>
		// This example adds a search box to a map, using the Google Place Autocomplete
		// feature. People can enter geographical searches. The search box will return a
		// pick list containing a mix of places and predicted search terms.
		// This example requires the Places library. Include the libraries=places
		// parameter when you first load the API. For example:
		// <script src="https://maps.googleapis.com/maps/api/js?key=YOUR_API_KEY&libraries=places">
		function initAutocomplete() {
			var map = new google.maps.Map(document.getElementById('map'), {
				center: {
					lat: -33.8688,
					lng: 151.2195
				},
				zoom: 13,
				mapTypeId: 'roadmap'
			});
			// Create the search box and link it to the UI element.
			var input = document.getElementById('pac-input');
			var searchBox = new google.maps.places.SearchBox(input);
			map.controls[google.maps.ControlPosition.TOP_LEFT].push(input);
			// Bias the SearchBox results towards current map's viewport.
			map.addListener('bounds_changed', function() {
				searchBox.setBounds(map.getBounds());
			});
			var markers = [];
			// Listen for the event fired when the user selects a prediction and retrieve
			// more details for that place.
			searchBox.addListener('places_changed', function() {
				var places = searchBox.getPlaces();
				if (places.length == 0) {
					return;
				}
				// Clear out the old markers.
				markers.forEach(function(marker) {
					marker.setMap(null);
				});
				markers = [];
				// For each place, get the icon, name and location.
				var bounds = new google.maps.LatLngBounds();
				places.forEach(function(place) {
					if (!place.geometry) {
						console.log("Returned place contains no geometry");
						return;
					}

                                        // place 에서 위경도 값을 읽어올 수 있음. 
					console.log(place.geometry.location.lat());
					console.log(place.geometry.location.lng());

					var icon = {
						url: place.icon,
						size: new google.maps.Size(71, 71),
						origin: new google.maps.Point(0, 0),
						anchor: new google.maps.Point(17, 34),
						scaledSize: new google.maps.Size(25, 25)
					};
					// Create a marker for each place.
					markers.push(new google.maps.Marker({
						map: map,
						icon: icon,
						title: place.name,
						position: place.geometry.location
					}));
					if (place.geometry.viewport) {
						// Only geocodes have viewport.
						bounds.union(place.geometry.viewport);
					} else {
						bounds.extend(place.geometry.location);
					}
				});
				map.fitBounds(bounds);
			});
		}
	</script>
	<script src="https://maps.googleapis.com/maps/api/js?key=&libraries=places&callback=initAutocomplete" async defer></script>
</body>

</html>


댓글()

[vb.net] 정해진 시간에 지정 URL로 브라우저 실행하는 프로그램

Progmming/.Net|2018. 6. 19. 16:38
반응형

얼마전부터 새로이.. 어플리케이션 공부를 시작했습니다.


어딘가 특별나게 써먹을 목적으로 하는건 아니고 


그때 그때 필요한게 있으면 만들어서 써볼까하는 마음으로요.




10원짜리 툴 첫번째.




개발 배경 


지정 시간에 오픈하는 핫딜의 경우 까먹기 쉬워서


알람도 맞추고 했으나 결국은 로그인하다가 시간 까먹고 끝..


그래서 지정된 시간에 브라우저 열어주면 좋겠다 싶어서 만들었습니다.


한때는 https://time.navyism.com/ 네이비즘 사이트도 애용했으나 


그 기능을 합쳐서 도전.







사용법 


1. 핫딜 오픈 시간 입력.


2. 몇분전에 알림 받을 지 선택 ( 기본 3분전 )


3. 핫딜 URL 입력 길어도 됩니다. 그냥 몽땅 때려넣음.


4. 시작



시작되면 몇초가 남았는지..나오고 0초가 되면 브라우저가 실행됩니다.



64Bit OS가 기본이라 생각(?)하고 브라우저는 


C:\Program Files (x86)\Google\Chrome\Application\chrome.exe 


C:\Program Files\Internet Explorer\iexplore.exe


위 2개의 경로를 확인하여 실행합니다.


윈도우 기본 브라우저 경로를 어떻게 가져와야 하는지 모르겠네요..


-_-ㅎ.. 아시는분 팁좀 부탁드립니다.





각각의 실행 파일과 소스 파일를 첨부합니다.


HDA.exe


HDA.zip




ps. 개인적인 스터디와 재미 , 흥미로 인한 코딩이므로 무의미한 디스는 거부하겠습니다. 

반사!



적절한 조언은 감사히 받겠습니다 :)

댓글()

[ VB.net ] 특정 웹서버 시간 읽어오기

Progmming/.Net|2018. 6. 4. 14:14
반응형

핫딜 주소와 시간을 셋팅해서 


구매시에 도움을 주는 CS프로그램을 하나 만들어보려고 하는 중에 정리.


1분 1초가 중요한 거라 해당 웹 서버의 시간을 읽어와서 처리하는 샘플 코드.


요점은 WebResponse의 해더에서 Date를 읽어와서 이용하는 것. 


아래는 인터파크의 웹서버 시간을 읽어오기 위한 코드.


   

Imports System.Net

Public Class Form1

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim myHttpWebRequest As HttpWebRequest = CType(WebRequest.Create("http://www.interpark.com"), HttpWebRequest)
        Dim myHttpWebResponse As HttpWebResponse = CType(myHttpWebRequest.GetResponse(), HttpWebResponse)

        Dim i As Integer
        While i < myHttpWebResponse.Headers.Count
            Console.WriteLine(ControlChars.Cr + "Header Name:{0}, Value :{1}", myHttpWebResponse.Headers.Keys(i), myHttpWebResponse.Headers(i))
            i = i + 1
        End While


        myHttpWebResponse.Close()

        myHttpWebRequest = Nothing
        myHttpWebResponse = Nothing

    End Sub
End Class



출력 결과 형태는 굵게 표시한 Date 를 이용하면 된다.


Header Name:Age, Value :182


Header Name:Vary, Value :Accept-Encoding, User-Agent


Header Name:Content-Length, Value :2935


Header Name:Content-Type, Value :text/html


Header Name:Date, Value :Mon, 04 Jun 2018 05:15:04 GMT


Header Name:Last-Modified, Value :Wed, 28 Feb 2018 05:30:03 GMT


Header Name:P3P, Value :CP="ALL CURa ADMa DEVa TAIa OUR BUS IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE LOC OTC"


댓글()